使用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,而不是当我想构造函数中的一个实例,它需要对具体的服务类有深入的了解。

我是否不必要地担心或者有没有更好的方法来做到这一点?

西蒙

+0

我觉得当你做绑定()。为了(),您可以追加一个.WithParameter (新的Ninject.Parameters.ConstructorArgument())像你一样...不知道,但我还没有得到那里只是我的项目。 –

+0

您还应该通过构造函数将IMyService注入MyController。 Ninject.Web.MVC项目提供了一个控制器工厂,可以让您轻松完成此任务。一般来说,如果您发现自己手动将内容从内核中提取出来,那么设计恕我直言,可能会出现问题。 – Brook

+0

这与我最后采取的方法大致相同。在构造器注入之后,我将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,模式看起来非常简单。我想这是你付出的代价。 –