我有一些类,它们接受返回对象的委托:
public class ApiAuditor : IAuditor
{
public Func<FooAPI> ApiGet { get; private set; }
public ApiAuditor(Func<FooAPI> apiGet)
{
ApiGet = apiGet;
}
public bool Audit(Audit[] audits)
{
if(someCondition)
return false; //no need for FooAPI
return ApiGet().AuditJobs(audits);
}
}
这个想法是这些类中的一些可能需要一个对象的实例(在这种情况下为FooAPI)但并非总是如此。因此,它们作为委托注入,如果需要可以返回实例。
使用Ninject我只是想看看这种类型的绑定是否是最好的方法?
Bind<IAuditor>().ToMethod(c => new ApiAuditor(() => c.Kernel.Get<FooAPI>()));
再详细说明一下,我想我的部分问题是,每当构造函数参数需要一些显式解析时,我一直在使用Bind.WithConstructorArgument()。我想我仍然可以使用它,但它的可读性较差,因为它最终会像:
Bind<IAuditor>().To<ApiAuditor>().WithConstructorArgument("apiGet", x => ( (Func<FooAPI>)(() => x.Kernel.Get<FooAPI>())));
答案 0 :(得分:0)
自己防止接线。您可以执行以下操作:
kernel.Bind<IApiAuditor>().To<ApiAuditor>();
kernel.Bind<Func<FooAPI>>().ToConstant(() => kernel.Get<FooAPI>()));
请注意,您通常不应该担心注入未使用的实例。性能损失通常是可以忽略的,因此您应该简单地创建以下构造函数:
public ApiAuditor(FooAPI foo)
{
this.foo = foo;
}
这使您的注册更容易:
Bind<IApiAuditor>().To<ApiAuditor>();
Bind<FooAPI>().ToSelf();