我正在尝试将Ninject用于以下场景

时间:2013-03-01 04:30:24

标签: c# dependency-injection constructor ninject

我的要求与此处提出的问题非常相似   - With.Parameters.ConstructorArgument with ninject 2.0 这可能是一个愚蠢的问题 - 但是,在调用Get<IMyType>期间,不是向构造函数发送参数的方法违背了去耦的哲学(我认为这是DI的主要动机) )本身?
这假定IMyType的用户了解IMyType的具体实现的构造函数。
由于无法在接口中声明构造函数参数,因此将来可能会添加另一个实现,这将在构造函数和参数中使用不同的参数集。你绑定到该实现。再次,按照解耦的原则,执行Bind<IMyType>.To<ADifferentImpl>()的代码应该能够使用之前编写的任何模块,它从Get<IMyType>获取实现对象。

我有非常相似的要求 - 我不知道绑定时构造函数参数的值,但仅在访问时。我认为在特定情况下遵循的最佳方法是与Adrian Grigore的答案一致。 如果有任何其他方法,请告诉我。

1 个答案:

答案 0 :(得分:0)

我将举例说明我是如何做到的:

public static class DI
{
    private static IKernel _kernel;
    private static Boolean _kernelLoaded = false;
    public static T Resolve<T>() where T : class
    {
        ...
        var a = _kernel.Get<T>();
        return a;
    }
   ...
}

以下是具有parammetrs的构造函数的UserRepository类:

public class UserRepository : RepositoryBase<User>, IUserRepository
{
    public UserRepository(IMyContext context)
        : base(context)
    {
    }

    public void AddList(String name)
    {

    }
}

正如您所看到的,我的构造函数仅使用MyContext的接口,如果在ninject中注册,Ninject会自动提供IMyContext示例的默认构造函数。

以下是ninject中绑定的示例:

    public override void Load()
    {
        Bind(typeof(IUserRepository)).To(typef(UserRepository));
        Bind(typeof(IMyContext)).To(typeof(MyContext));
        ...
    }

所以我可以在我的代码中得到这个存储库:

        var repository = DI.Resolve<IUserRepository>();
        List<User> users = repository.GetAll();

它也在运作