NB Ninject 3.0と、これは完全にNinject.Extensions.Factory
パッケージを使用してサポートしている、Wikiを参照してください。 - https://github.com/ninject/ninject.extensions.factory/wiki
EDIT:NBありNinject 2.3での実装(完全にテストされたリリースではありませんが、is available from the CodeBetter server)
Ninjectはこれをネイティブで現時点でサポートしていません。これを次のバージョンに追加する予定です。しかし、適切なバインディングを設定することで、サポートを簡単に追加できます。下にモジュールをロードしてお楽しみください。
public class FuncModule : NinjectModule
{
public override void Load()
{
this.Kernel.Bind(typeof(Func<>)).ToMethod(CreateFunc).When(VerifyFactoryFunction);
}
private static bool VerifyFactoryFunction(IRequest request)
{
var genericArguments = request.Service.GetGenericArguments();
if (genericArguments.Count() != 1)
{
return false;
}
var instanceType = genericArguments.Single();
return request.ParentContext.Kernel.CanResolve(new Request(genericArguments[0], null, new IParameter[0], null, false, true)) ||
TypeIsSelfBindable(instanceType);
}
private static object CreateFunc(IContext ctx)
{
var functionFactoryType = typeof(FunctionFactory<>).MakeGenericType(ctx.GenericArguments);
var ctor = functionFactoryType.GetConstructors().Single();
var functionFactory = ctor.Invoke(new object[] { ctx.Kernel });
return functionFactoryType.GetMethod("Create").Invoke(functionFactory, new object[0]);
}
private static bool TypeIsSelfBindable(Type service)
{
return !service.IsInterface
&& !service.IsAbstract
&& !service.IsValueType
&& service != typeof(string)
&& !service.ContainsGenericParameters;
}
public class FunctionFactory<T>
{
private readonly IKernel kernel;
public FunctionFactory(IKernel kernel)
{
this.kernel = kernel;
}
public Func<T> Create()
{
return() => this.kernel.Get<T>();
}
}
}
ありがとうございます!次のバージョンを楽しみにしています。 –
すべてのあなたの勤勉Remoをありがとう。 Func>で動作するようにコードを拡張することは可能ですか? –
Anders
そうです。 FunctionFactory.Createメソッドを変更し、IEnumerableをチェックし、代わりにGetAllを返します。 –