Asp.net mvc 使用Ninject设置服务

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

首先,我是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;
    }
}
所以我想我应该反对它。我想到了这个:

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,而不是何时需要构造函数中的实例,这需要事先了解具体的服务类

我是在无谓地担心还是有更好的方法


Simon

MyService真的需要构建一个
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,模式似乎非常简单。我想这是你付出的代价。