1

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

我有非常相似的要求 - 在绑定时我不知道构造函数参数的值,但仅在访问时才知道。我认为在给定情况下遵循的最佳方法是采用 Adrian Grigore 的回答。请让我知道是否有任何其他方法。

4

1 回答 1

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;
    }
   ...
}

这是具有带参数的构造函数的类 UserRepository:

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

    public void AddList(String name)
    {

    }
}

如您所见,我的构造函数仅适用于 的接口MyContext,如果在 ninject 中注册了 IMyContext 示例的默认构造函数,则 Ninject 会自动赋予它。

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

它也很有效

于 2013-03-01T04:42:00.593 回答