使用Ninject来设置服务
问题描述:
首先,我是Ninject的新手,但这个问题的目标是Ninject,它似乎一般适用于DI。使用Ninject来设置服务
我想我在这里失去了一些东西。迄今为止建议的解决方案似乎都非常复杂。
我有这样的事情:
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
}
}
在我看来,虽然,我应该能够改变它结合的位(在此标记),因此在这一点上知道拿到的ModelState,而不是当我想构造函数中的一个实例,它需要对具体的服务类有深入的了解。
我是否不必要地担心或者有没有更好的方法来做到这一点?
西蒙
答
是否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();
}
}
+0
昨天我们讨论了这个问题。传递ModelState只是说明性的,但它可以是调用类的任何东西。没有DI,模式看起来非常简单。我想这是你付出的代价。 –
我觉得当你做绑定()。为了(),您可以追加一个.WithParameter (新的Ninject.Parameters.ConstructorArgument())像你一样...不知道,但我还没有得到那里只是我的项目。 –
您还应该通过构造函数将IMyService注入MyController。 Ninject.Web.MVC项目提供了一个控制器工厂,可以让您轻松完成此任务。一般来说,如果您发现自己手动将内容从内核中提取出来,那么设计恕我直言,可能会出现问题。 – Brook
这与我最后采取的方法大致相同。在构造器注入之后,我将ModelState传递给了一个属性。 –