使用Ninject设置服务

时间:2011-08-03 15:43:01

标签: asp.net-mvc dependency-injection ninject

首先,我是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
    }
}

在我看来,我应该能够改变它所绑定的位(在此处标记),因此它知道在那一点上获取模型状态,而不是在构造函数中需要一个实例,这需要预先知识具体的服务类。

我是不必要地担心还是有更好的方法来做这件事?

西蒙

1 个答案:

答案 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();
    }
}