我的要求与此处提出的问题非常相似
- With.Parameters.ConstructorArgument with ninject 2.0
这可能是一个愚蠢的问题 - 但是,在调用Get<IMyType>
期间,不是向构造函数发送参数的方法违背了去耦的哲学(我认为这是DI的主要动机) )本身?
这假定IMyType
的用户了解IMyType
的具体实现的构造函数。
由于无法在接口中声明构造函数参数,因此将来可能会添加另一个实现,这将在构造函数和参数中使用不同的参数集。你绑定到该实现。再次,按照解耦的原则,执行Bind<IMyType>.To<ADifferentImpl>()
的代码应该能够使用之前编写的任何模块,它从Get<IMyType>
获取实现对象。
我有非常相似的要求 - 我不知道绑定时构造函数参数的值,但仅在访问时。我认为在特定情况下遵循的最佳方法是与Adrian Grigore的答案一致。 如果有任何其他方法,请告诉我。
答案 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();
它也在运作