[ninject commit] r157 - in experiments/ninject2/src/Ninject: . Activation Activation/Blocks Activation/Caching Mod...

7 views
Skip to first unread message

codesite...@google.com

unread,
Mar 7, 2009, 11:35:58 AM3/7/09
to ninje...@googlegroups.com
Author: nkohari
Date: Sat Mar 7 08:35:11 2009
New Revision: 157

Added:
experiments/ninject2/src/Ninject/Modules/IModule.cs
experiments/ninject2/src/Ninject/Syntax/BindingRoot.cs
- copied, changed from r152,
/experiments/ninject2/src/Ninject/Syntax/IBindingRoot.cs
Removed:
experiments/ninject2/src/Ninject/Activation/Hook.cs
Modified:
experiments/ninject2/src/Ninject/Activation/Blocks/ActivationBlock.cs
experiments/ninject2/src/Ninject/Activation/Caching/Cache.cs
experiments/ninject2/src/Ninject/Activation/Caching/ICache.cs
experiments/ninject2/src/Ninject/IKernel.cs
experiments/ninject2/src/Ninject/KernelBase.cs
experiments/ninject2/src/Ninject/Modules/Module.cs
experiments/ninject2/src/Ninject/Ninject.csproj
experiments/ninject2/src/Ninject/Planning/Targets/Target.cs
experiments/ninject2/src/Ninject/Syntax/IBindingRoot.cs
experiments/ninject2/src/Ninject/Syntax/IResolutionRoot.cs
experiments/ninject2/src/Ninject/Syntax/ResolutionExtensions.cs

Log:


Modified:
experiments/ninject2/src/Ninject/Activation/Blocks/ActivationBlock.cs
==============================================================================
--- experiments/ninject2/src/Ninject/Activation/Blocks/ActivationBlock.cs
(original)
+++ experiments/ninject2/src/Ninject/Activation/Blocks/ActivationBlock.cs
Sat Mar 7 08:35:11 2009
@@ -56,11 +56,12 @@
}

/// <summary>
- /// Resolves activation hooks for the specified request.
+ /// Resolves instances for the specified request. The instances are not
actually resolved
+ /// until a consumer iterates over the enumerator.
/// </summary>
/// <param name="request">The request to resolve.</param>
- /// <returns>A series of hooks that can be used to resolve instances
that match the request.</returns>
- public IEnumerable<Hook> Resolve(IRequest request)
+ /// <returns>An enumerator of instances that match the request.</returns>
+ public IEnumerable<object> Resolve(IRequest request)
{
return Parent.Resolve(request);
}

Modified: experiments/ninject2/src/Ninject/Activation/Caching/Cache.cs
==============================================================================
--- experiments/ninject2/src/Ninject/Activation/Caching/Cache.cs (original)
+++ experiments/ninject2/src/Ninject/Activation/Caching/Cache.cs Sat Mar 7
08:35:11 2009
@@ -16,6 +16,7 @@
#endregion
#region Using Directives
using System;
+using System.Collections.Generic;
using System.Linq;
using Ninject.Components;
using Ninject.Infrastructure;
@@ -51,6 +52,17 @@
}

/// <summary>
+ /// Releases resources held by the object.
+ /// </summary>
+ public override void Dispose(bool disposing)
+ {
+ if (disposing && !IsDisposed)
+ Clear();
+
+ base.Dispose(disposing);
+ }
+
+ /// <summary>
/// Stores the specified context in the cache.
/// </summary>
/// <param name="context">The context to store.</param>
@@ -103,24 +115,31 @@
}

/// <summary>
- /// Removes instances from the cache whose scopes have been garbage
collected.
+ /// Removes instances from the cache which should no longer be re-used.
/// </summary>
public void Prune()
{
lock (_entries)
{
- foreach (IBinding binding in _entries.Keys)
- _entries[binding].Where(e => !e.Scope.IsAlive).ToArray().Map(Forget);
+ _entries.SelectMany(e => e.Value).Where(e
=> !e.Scope.IsAlive).ToArray().Map(Forget);
}
}

- private void Forget(CacheEntry entry)
+ /// <summary>
+ /// Immediately deactivates and removes all instances in the cache,
regardless of scope.
+ /// </summary>
+ public void Clear()
{
lock (_entries)
{
- Pipeline.Deactivate(entry.Context);
- _entries[entry.Context.Binding].Remove(entry);
+ _entries.SelectMany(e => e.Value).ToArray().Map(Forget);
}
+ }
+
+ private void Forget(CacheEntry entry)
+ {
+ Pipeline.Deactivate(entry.Context);
+ _entries[entry.Context.Binding].Remove(entry);
}

private class CacheEntry

Modified: experiments/ninject2/src/Ninject/Activation/Caching/ICache.cs
==============================================================================
--- experiments/ninject2/src/Ninject/Activation/Caching/ICache.cs (original)
+++ experiments/ninject2/src/Ninject/Activation/Caching/ICache.cs Sat Mar
7 08:35:11 2009
@@ -43,5 +43,10 @@
/// Removes instances from the cache which should no longer be re-used.
/// </summary>
void Prune();
+
+ /// <summary>
+ /// Immediately deactivates and removes all instances in the cache,
regardless of scope.
+ /// </summary>
+ void Clear();
}
}

Modified: experiments/ninject2/src/Ninject/IKernel.cs
==============================================================================
--- experiments/ninject2/src/Ninject/IKernel.cs (original)
+++ experiments/ninject2/src/Ninject/IKernel.cs Sat Mar 7 08:35:11 2009
@@ -46,6 +46,16 @@
IComponentContainer Components { get; }

/// <summary>
+ /// Occurs when a binding is added.
+ /// </summary>
+ event EventHandler<BindingEventArgs> BindingAdded;
+
+ /// <summary>
+ /// Occurs when a binding is removed.
+ /// </summary>
+ event EventHandler<BindingEventArgs> BindingRemoved;
+
+ /// <summary>
/// Occurs when a module is loaded.
/// </summary>
event EventHandler<ModuleEventArgs> ModuleLoaded;

Modified: experiments/ninject2/src/Ninject/KernelBase.cs
==============================================================================
--- experiments/ninject2/src/Ninject/KernelBase.cs (original)
+++ experiments/ninject2/src/Ninject/KernelBase.cs Sat Mar 7 08:35:11 2009
@@ -25,7 +25,6 @@
using Ninject.Components;
using Ninject.Events;
using Ninject.Infrastructure;
-using Ninject.Infrastructure.Disposal;
using Ninject.Infrastructure.Introspection;
using Ninject.Infrastructure.Language;
using Ninject.Modules;
@@ -40,7 +39,7 @@
/// <summary>
/// The base implementation of an <see cref="IKernel"/>.
/// </summary>
- public abstract class KernelBase : DisposableObject, IKernel
+ public abstract class KernelBase : BindingRoot, IKernel
{
private readonly Multimap<Type, IBinding> _bindings = new Multimap<Type,
IBinding>();
private readonly Dictionary<Type, IModule> _modules = new
Dictionary<Type, IModule>();
@@ -162,28 +161,10 @@
}

/// <summary>
- /// Declares a binding for the specified service using the fluent syntax.
- /// </summary>
- /// <typeparam name="T">The service to bind.</typeparam>
- public IBindingToSyntax<T> Bind<T>()
- {
- return RegisterBindingAndCreateBuilder<T>(typeof(T));
- }
-
- /// <summary>
- /// Declares a binding for the specified service using the fluent syntax.
- /// </summary>
- /// <param name="service">The service to bind.</param>
- public IBindingToSyntax<object> Bind(Type service)
- {
- return RegisterBindingAndCreateBuilder<object>(service);
- }
-
- /// <summary>
/// Registers the specified binding.
/// </summary>
/// <param name="binding">The binding to add.</param>
- public void AddBinding(IBinding binding)
+ public override void AddBinding(IBinding binding)
{
_bindings.Add(binding.Service, binding);
BindingAdded.Raise(this, new BindingEventArgs(binding));
@@ -193,7 +174,7 @@
/// Unregisters the specified binding.
/// </summary>
/// <param name="binding">The binding to remove.</param>
- public void RemoveBinding(IBinding binding)
+ public override void RemoveBinding(IBinding binding)
{
_bindings.Remove(binding.Service, binding);
BindingRemoved.Raise(this, new BindingEventArgs(binding));
@@ -238,19 +219,20 @@
}

/// <summary>
- /// Resolves activation hooks for the specified request.
+ /// Resolves instances for the specified request. The instances are not
actually resolved
+ /// until a consumer iterates over the enumerator.
/// </summary>
/// <param name="request">The request to resolve.</param>
- /// <returns>A series of hooks that can be used to resolve instances
that match the request.</returns>
- public virtual IEnumerable<Hook> Resolve(IRequest request)
+ /// <returns>An enumerator of instances that match the request.</returns>
+ public virtual IEnumerable<object> Resolve(IRequest request)
{
if (request.Service == typeof(IKernel))
- return new[] { new Hook(this) };
+ return new[] { this };

- if (!CanResolve(request)
&& !TryRegisterImplicitSelfBinding(request.Service))
+ if (!CanResolve(request) && !HandleMissingBinding(request.Service))
{
if (request.IsOptional)
- return Enumerable.Empty<Hook>();
+ return Enumerable.Empty<object>();
else
throw new
ActivationException(ExceptionFormatter.CouldNotResolveBinding(request));
}
@@ -258,7 +240,7 @@
return GetBindings(request)
.Where(binding => binding.Matches(request) && request.Matches(binding))
.Select(binding => CreateContext(request, binding))
- .Select(context => CreateHook(context));
+ .Select(context => context.Resolve());
}

/// <summary>
@@ -308,11 +290,12 @@
protected abstract void AddComponents();

/// <summary>
- /// Tries to register an implicit self-binding for the specified service.
+ /// Tries to handle a missing binding by registering an implicit
self-binding for the
+ /// specified service.
/// </summary>
/// <param name="service">The service.</param>
/// <returns><c>True</c> if the type is self-bindable; otherwise
<c>false</c>.</returns>
- protected virtual bool TryRegisterImplicitSelfBinding(Type service)
+ protected virtual bool HandleMissingBinding(Type service)
{
if (service.IsInterface || service.IsAbstract ||
service.ContainsGenericParameters)
return false;
@@ -329,19 +312,6 @@
}

/// <summary>
- /// Registers the specified binding and creates a builder to complete it.
- /// </summary>
- /// <typeparam name="T">The service being bound, or <see cref="object"/>
if the non-generic version was used.</typeparam>
- /// <param name="service">The service being bound.</param>
- /// <returns>The builder that can be used to complete the
binding.</returns>
- protected virtual BindingBuilder<T>
RegisterBindingAndCreateBuilder<T>(Type service)
- {
- var binding = new Binding(service);
- AddBinding(binding);
- return new BindingBuilder<T>(binding);
- }
-
- /// <summary>
/// Creates a context for the specified request and binding.
/// </summary>
/// <param name="request">The request.</param>
@@ -350,16 +320,6 @@
protected virtual IContext CreateContext(IRequest request, IBinding
binding)
{
return new Context(this, request, binding, Components.Get<ICache>(),
Components.Get<IPlanner>(), Components.Get<IPipeline>());
- }
-
- /// <summary>
- /// Creates a hook that can resolve the specified context.
- /// </summary>
- /// <param name="context">The context.</param>
- /// <returns>The created hook.</returns>
- protected virtual Hook CreateHook(IContext context)
- {
- return new Hook(context.Resolve);
}
}
}

Added: experiments/ninject2/src/Ninject/Modules/IModule.cs
==============================================================================
--- (empty file)
+++ experiments/ninject2/src/Ninject/Modules/IModule.cs Sat Mar 7 08:35:11
2009
@@ -0,0 +1,46 @@
+#region License
+// Author: Nate Kohari <na...@enkari.com>
+// Copyright (c) 2007-2009, Enkari, Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+#endregion
+#region Using Directives
+using System;
+using Ninject.Syntax;
+#endregion
+
+namespace Ninject.Modules
+{
+ /// <summary>
+ /// A pluggable unit that can be loaded into a kernel.
+ /// </summary>
+ public interface IModule : IBindingRoot
+ {
+ /// <summary>
+ /// Gets or sets the kernel that the module is loaded into.
+ /// </summary>
+ IKernel Kernel { get; set; }
+
+ /// <summary>
+ /// Called when the module is loaded into a kernel.
+ /// </summary>
+ /// <param name="kernel">The kernel that is loading the module.</param>
+ void OnLoad(IKernel kernel);
+
+ /// <summary>
+ /// Called when the module is unloaded from a kernel.
+ /// </summary>
+ /// <param name="kernel">The kernel that is unloading the module.</param>
+ void OnUnload(IKernel kernel);
+ }
+}
\ No newline at end of file

Modified: experiments/ninject2/src/Ninject/Modules/Module.cs
==============================================================================
--- experiments/ninject2/src/Ninject/Modules/Module.cs (original)
+++ experiments/ninject2/src/Ninject/Modules/Module.cs Sat Mar 7 08:35:11
2009
@@ -28,7 +28,7 @@
/// <summary>
/// A pluggable unit that can be loaded into a kernel.
/// </summary>
- public abstract class Module : IModule
+ public abstract class Module : BindingRoot, IModule
{
/// <summary>
/// Gets or sets the kernel that the module is loaded into.
@@ -41,16 +41,6 @@
public ICollection<IBinding> Bindings { get; private set; }

/// <summary>
- /// Occurs when a binding is added.
- /// </summary>
- public event EventHandler<BindingEventArgs> BindingAdded;
-
- /// <summary>
- /// Occurs when a binding is removed.
- /// </summary>
- public event EventHandler<BindingEventArgs> BindingRemoved;
-
- /// <summary>
/// Initializes a new instance of the <see cref="Module"/> class.
/// </summary>
protected Module()
@@ -90,56 +80,23 @@
public virtual void Unload() { }

/// <summary>
- /// Declares a binding for the specified service using the fluent syntax.
- /// </summary>
- /// <typeparam name="T">The service to bind.</typeparam>
- public IBindingToSyntax<T> Bind<T>()
- {
- return RegisterBindingAndCreateBuilder<T>(typeof(T));
- }
-
- /// <summary>
- /// Declares a binding for the specified service using the fluent syntax.
- /// </summary>
- /// <param name="service">The service to bind.</param>
- public IBindingToSyntax<object> Bind(Type service)
- {
- return RegisterBindingAndCreateBuilder<object>(service);
- }
-
- /// <summary>
/// Registers the specified binding.
/// </summary>
/// <param name="binding">The binding to add.</param>
- public void AddBinding(IBinding binding)
+ public override void AddBinding(IBinding binding)
{
Kernel.AddBinding(binding);
Bindings.Add(binding);
- BindingAdded.Raise(this, new BindingEventArgs(binding));
}

/// <summary>
/// Unregisters the specified binding.
/// </summary>
/// <param name="binding">The binding to remove.</param>
- public void RemoveBinding(IBinding binding)
+ public override void RemoveBinding(IBinding binding)
{
Kernel.RemoveBinding(binding);
Bindings.Remove(binding);
- BindingRemoved.Raise(this, new BindingEventArgs(binding));
- }
-
- /// <summary>
- /// Registers the specified binding and creates a builder to complete it.
- /// </summary>
- /// <typeparam name="T">The service being bound, or <see cref="object"/>
if the non-generic version was used.</typeparam>
- /// <param name="service">The service being bound.</param>
- /// <returns>The builder that can be used to complete the
binding.</returns>
- protected virtual BindingBuilder<T>
RegisterBindingAndCreateBuilder<T>(Type service)
- {
- var binding = new Binding(service);
- AddBinding(binding);
- return new BindingBuilder<T>(binding);
}
}
}

Modified: experiments/ninject2/src/Ninject/Ninject.csproj
==============================================================================
--- experiments/ninject2/src/Ninject/Ninject.csproj (original)
+++ experiments/ninject2/src/Ninject/Ninject.csproj Sat Mar 7 08:35:11 2009
@@ -59,7 +59,6 @@
<SubType>Code</SubType>
</Compile>
<Compile Include="Activation\Caching\ICachePruner.cs" />
- <Compile Include="Activation\Hook.cs" />
<Compile Include="Attributes\OptionalAttribute.cs" />
<Compile Include="Activation\Caching\GarbageCollectionCachePruner.cs">
<SubType>Code</SubType>
@@ -112,6 +111,7 @@
<Compile Include="Infrastructure\Language\ExtensionsForIDictionary.cs"
/>
<Compile Include="Injection\Expressions\ExpressionHelper.cs" />
<Compile Include="Planning\Bindings\BindingTarget.cs" />
+ <Compile Include="Syntax\BindingRoot.cs" />
<Compile Include="Syntax\ModuleLoadExtensions.cs" />
<Compile Include="Events\BindingEventArgs.cs" />
<Compile Include="Events\ModuleEventArgs.cs" />

Modified: experiments/ninject2/src/Ninject/Planning/Targets/Target.cs
==============================================================================
--- experiments/ninject2/src/Ninject/Planning/Targets/Target.cs (original)
+++ experiments/ninject2/src/Ninject/Planning/Targets/Target.cs Sat Mar 7
08:35:11 2009
@@ -149,7 +149,7 @@
private IEnumerable<object> ResolveInstances(Type service, IContext
parent)
{
var request = parent.Request.CreateChild(service, this);
- return parent.Kernel.Resolve(request).Select(hook => hook.Resolve());
+ return parent.Kernel.Resolve(request);
}

private Func<IBindingMetadata, bool> ReadConstraintFromAttributes()

Copied: experiments/ninject2/src/Ninject/Syntax/BindingRoot.cs (from r152,
/experiments/ninject2/src/Ninject/Syntax/IBindingRoot.cs)
==============================================================================
--- /experiments/ninject2/src/Ninject/Syntax/IBindingRoot.cs (original)
+++ experiments/ninject2/src/Ninject/Syntax/BindingRoot.cs Sat Mar 7
08:35:11 2009
@@ -16,7 +16,7 @@
#endregion
#region Using Directives
using System;
-using Ninject.Events;
+using Ninject.Infrastructure.Disposal;
using Ninject.Planning.Bindings;
#endregion

@@ -25,40 +25,43 @@
/// <summary>
/// Provides a path to register bindings.
/// </summary>
- public interface IBindingRoot
+ public abstract class BindingRoot : DisposableObject, IBindingRoot
{
/// <summary>
- /// Occurs when a binding is added.
- /// </summary>
- event EventHandler<BindingEventArgs> BindingAdded;
-
- /// <summary>
- /// Occurs when a binding is removed.
- /// </summary>
- event EventHandler<BindingEventArgs> BindingRemoved;
-
- /// <summary>
- /// Declares a binding for the specified service using the fluent syntax.
+ /// Declares a binding for the specified service.
/// </summary>
/// <typeparam name="T">The service to bind.</typeparam>
- IBindingToSyntax<T> Bind<T>();
+ public IBindingToSyntax<T> Bind<T>()
+ {
+ return RegisterBindingAndCreateBuilder<T>(typeof(T));
+ }

/// <summary>
- /// Declares a binding for the specified service using the fluent syntax.
+ /// Declares a binding for the specified service.
/// </summary>
/// <param name="service">The service to bind.</param>
- IBindingToSyntax<object> Bind(Type service);
+ public IBindingToSyntax<object> Bind(Type service)
+ {
+ return RegisterBindingAndCreateBuilder<object>(service);
+ }

/// <summary>
/// Registers the specified binding.
/// </summary>
/// <param name="binding">The binding to add.</param>
- void AddBinding(IBinding binding);
+ public abstract void AddBinding(IBinding binding);

/// <summary>
/// Unregisters the specified binding.
/// </summary>
/// <param name="binding">The binding to remove.</param>
- void RemoveBinding(IBinding binding);
+ public abstract void RemoveBinding(IBinding binding);
+
+ private BindingBuilder<T> RegisterBindingAndCreateBuilder<T>(Type
service)
+ {
+ var binding = new Binding(service);
+ AddBinding(binding);
+ return new BindingBuilder<T>(binding);
+ }
}
}

Modified: experiments/ninject2/src/Ninject/Syntax/IBindingRoot.cs
==============================================================================
--- experiments/ninject2/src/Ninject/Syntax/IBindingRoot.cs (original)
+++ experiments/ninject2/src/Ninject/Syntax/IBindingRoot.cs Sat Mar 7
08:35:11 2009
@@ -28,23 +28,13 @@
public interface IBindingRoot
{
/// <summary>
- /// Occurs when a binding is added.
- /// </summary>
- event EventHandler<BindingEventArgs> BindingAdded;
-
- /// <summary>
- /// Occurs when a binding is removed.
- /// </summary>
- event EventHandler<BindingEventArgs> BindingRemoved;
-
- /// <summary>
- /// Declares a binding for the specified service using the fluent syntax.
+ /// Declares a binding for the specified service.
/// </summary>
/// <typeparam name="T">The service to bind.</typeparam>
IBindingToSyntax<T> Bind<T>();

/// <summary>
- /// Declares a binding for the specified service using the fluent syntax.
+ /// Declares a binding for the specified service.
/// </summary>
/// <param name="service">The service to bind.</param>
IBindingToSyntax<object> Bind(Type service);

Modified: experiments/ninject2/src/Ninject/Syntax/IResolutionRoot.cs
==============================================================================
--- experiments/ninject2/src/Ninject/Syntax/IResolutionRoot.cs (original)
+++ experiments/ninject2/src/Ninject/Syntax/IResolutionRoot.cs Sat Mar 7
08:35:11 2009
@@ -37,11 +37,12 @@
bool CanResolve(IRequest request);

/// <summary>
- /// Resolves activation hooks for the specified request.
+ /// Resolves instances for the specified request. The instances are not
actually resolved
+ /// until a consumer iterates over the enumerator.
/// </summary>
/// <param name="request">The request to resolve.</param>
- /// <returns>A series of hooks that can be used to resolve instances
that match the request.</returns>
- IEnumerable<Hook> Resolve(IRequest request);
+ /// <returns>An enumerator of instances that match the request.</returns>
+ IEnumerable<object> Resolve(IRequest request);

/// <summary>
/// Creates a request for the specified service.

Modified: experiments/ninject2/src/Ninject/Syntax/ResolutionExtensions.cs
==============================================================================
--- experiments/ninject2/src/Ninject/Syntax/ResolutionExtensions.cs
(original)
+++ experiments/ninject2/src/Ninject/Syntax/ResolutionExtensions.cs Sat
Mar 7 08:35:11 2009
@@ -262,7 +262,7 @@
private static IEnumerable<object> GetResolutionIterator(IResolutionRoot
root, Type service, Func<IBindingMetadata, bool> constraint,
IEnumerable<IParameter> parameters, bool isOptional)
{
IRequest request = root.CreateRequest(service, constraint, parameters,
isOptional);
- return root.Resolve(request).Select(hook => hook.Resolve());
+ return root.Resolve(request);
}
}
}
Reply all
Reply to author
Forward
0 new messages