首先,我是Ninject的新手,但是这个问题针对的是Ninject,它似乎适用于DI。
我想我在这里遗漏了一些东西。到目前为止,建议的解决方案似乎都非常复杂。
我有这样的事情:
public class MyController : Controller
{
private IMyService _Service;
public MyController()
:this(null)
{ }
public MyController(IMyService service)
{
_Service = service ?? new MyService(ModelState);
}
}
public IMyService
{}
public class MyService : IMyService
{
private ModelStateDictionary _Model;
public MyService(ModelStateDictionary model)
{
_Model = model;
}
}
所以我以为我会去Ninject。想出了这个:
public class MyController : Controller
{
private IMyService _Service;
public MyController()
:this(null)
{
_Service = Locator.Kernel.Get<IMyService>(new Ninject.Parameters.ConstructorArgument("model", ModelState));
}
}
public class MyServiceModule : NinjectModule
{
public override Load()
{
Bind<IMyService>().To<MyService>(); //here
}
}
在我看来,我应该能够改变它所绑定的位(在此处标记),因此它知道在那一点上获取模型状态,而不是在构造函数中需要一个实例,这需要预先知识具体的服务类。
我是不必要地担心还是有更好的方法来做这件事?
西蒙
答案 0 :(得分:0)
MyService
确实需要构建ModelStateDictionary
吗?
我希望重构一下,以便将ModelStateDictionary
传递给我调用的方法,而不是要求它构建Service类。
如果这样的重构不合理,您可能希望在ModelStateDictionary
public interface IModelStateProvider {
ModelStateDictionary GetModelState();
}
并创建可以检索当前上下文ModelStateDictionary
的接口的实现,然后设置该接口的绑定并更改服务类以将其置于构造函数中:
public class MyService : IMyService
{
private ModelStateDictionary _Model;
public MyService(IModelStateProvider modelStateProvider)
{
_Model = modelStateProvider.GetModelState();
}
}