带委托的Ninject构造函数

时间:2013-11-20 10:33:50

标签: c# ninject inversion-of-control

我有一些类,它们接受返回对象的委托:

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>())));

1 个答案:

答案 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();