NB Ninject에 3.0 이상이 완전히 위키를 참조 Ninject.Extensions.Factory
패키지를 사용하여 지원이 있습니다
그냥,이 게시물을 발견 대답은 '노 보인다 : -
https://github.com/ninject/ninject.extensions.factory/wiki
편집 : NB는 0이 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을 반환하십시오. –