Asp.net mvc 使用Ninject设置服务
首先,我是Ninject的新手,但尽管这个问题针对Ninject,但它似乎一般适用于DI 我想我遗漏了什么。迄今为止提出的解决方案似乎都非常复杂 我有这样的想法:Asp.net mvc 使用Ninject设置服务,asp.net-mvc,dependency-injection,ninject,Asp.net Mvc,Dependency Injection,Ninject,首先,我是Ninject的新手,但尽管这个问题针对Ninject,但它似乎一般适用于DI 我想我遗漏了什么。迄今为止提出的解决方案似乎都非常复杂 我有这样的想法: public class MyController : Controller { private IMyService _Service; public MyController() :this(null) { } public MyController(IMyService ser
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;
}
}
所以我想我应该反对它。我想到了这个:
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
}
}
公共类MyController:Controller
{
私人IMY服务;
公共MyController()
:此(空)
{
_Service=Locator.Kernel.Get(新的Ninject.Parameters.ConstructorArgument(“model”,ModelState));
}
}
公共类MyServiceModule:NinjectModule
{
公共覆盖加载()
{
Bind().To();//此处
}
}
不过,在我看来,我应该能够更改它绑定的位(在这里标记),以便它知道在该点获取modelstate,而不是何时需要构造函数中的实例,这需要事先了解具体的服务类
我是在无谓地担心还是有更好的方法
SimonMyService真的需要构建一个
ModelStateDictionary
我希望对其进行重构,以便将ModelStateDictionary
传递到我调用的方法中,而不是在构建服务类时需要它
如果这样的重构是不合理的,那么您可能需要在ModelStateDictionary
public interface IModelStateProvider {
ModelStateDictionary GetModelState();
}
并实现该接口,该接口可以检索当前上下文的ModelStateDictionary
,然后设置该接口的绑定并更改服务类以将其包含在构造函数中:
public class MyService : IMyService
{
private ModelStateDictionary _Model;
public MyService(IModelStateProvider modelStateProvider)
{
_Model = modelStateProvider.GetModelState();
}
}
我认为,当您执行Bind().To()时,您可以添加一个.WithParameter(新的Ninject.Parameters.ConstructorArgument()),就像您所拥有的那样。。。但我不确定,因为我的项目还没有完成。您还应该通过构造函数将IMyService注入MyController。Ninject.Web.MVC项目提供了一个控制器工厂,您可以轻松地完成这项工作。一般来说,如果您发现自己手动从内核中取出东西,那么设计IMHO可能有问题。这与我最后采用的方法大致相同。在构造函数注入之后,我将ModelState传递到一个属性中。我们昨天讨论了很多这个问题。传递ModelState只是一个说明,但它可以是调用类的任何内容。如果没有DI,模式似乎非常简单。我想这是你付出的代价。