C# MVC3&;Ninject/Unity:注入分层服务容器
我已经使用Ninject有一段时间了,但只用于简单的DI。我有一个稍微复杂一点的场景,我想迎合 我正在使用带有控制器注入的Ninject.Web.MVC插件,该插件在我的a基控制器上强制执行,并传递给所有继承控制器。以下是我的基本模式:C# MVC3&;Ninject/Unity:注入分层服务容器,c#,asp.net-mvc-3,dependency-injection,ninject,unity-container,C#,Asp.net Mvc 3,Dependency Injection,Ninject,Unity Container,我已经使用Ninject有一段时间了,但只用于简单的DI。我有一个稍微复杂一点的场景,我想迎合 我正在使用带有控制器注入的Ninject.Web.MVC插件,该插件在我的a基控制器上强制执行,并传递给所有继承控制器。以下是我的基本模式: using System; using System.Web; using System.Web.Mvc; using Business; using Microsoft.Web.Infrastructure.DynamicModuleHelper; us
using System;
using System.Web;
using System.Web.Mvc;
using Business;
using Microsoft.Web.Infrastructure.DynamicModuleHelper;
using Ninject;
using Ninject.Web.Common;
namespace Web {
#region Controller
public class MyController : MyBaseController {
public MyController(IMyService1 myService1, IMyService2 myService2)
: base(myService1, myService2) {
}
public ActionResult MyAction() {
MyServiceProp1.DoSomething();
MyServiceProp2.DoSomethingElse();
return View();
}
}
public class MyBaseController : Controller {
protected IMyService1 MyServiceProp1 { get; set; }
protected IMyService2 MyServiceProp2 { get; set; }
public MyBaseController(IMyService1 myService1, IMyService2 myService2) {
MyServiceProp1 = myService1;
MyServiceProp2 = myService2;
}
}
#endregion
}
namespace Business {
#region Services
public interface IMyService1 {
void DoSomething();
}
public interface IMyService2 {
void DoSomethingElse();
}
public class MyService1 : IMyService1 {
public void DoSomething() {
}
}
public class MyService2 : IMyService2 {
public void DoSomethingElse() {
}
}
#endregion
}
#region Ninject stuff
namespace Web.App_Start {
public static class NinjectWebCommon {
private static readonly Bootstrapper bootstrapper = new Bootstrapper();
/// <summary>
/// Starts the application
/// </summary>
public static void Start() {
DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
bootstrapper.Initialize(CreateKernel);
}
/// <summary>
/// Stops the application.
/// </summary>
public static void Stop() {
bootstrapper.ShutDown();
}
/// <summary>
/// Creates a kernel that will manage the application.
/// </summary>
/// <returns>The created kernel.</returns>
private static IKernel CreateKernel() {
var kernel = new StandardKernel();
kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
RegisterServices(kernel);
return kernel;
}
/// <summary>
/// Loads modules and services
/// </summary>
/// <param name="kernel">The kernel.</param>
private static void RegisterServices(IKernel kernel) {
kernel.Bind<IMyService1>().To<MyService1>();
kernel.Bind<IMyService2>().To<MyService2>();
}
}
}
#endregion
这样,如果我需要添加一个全局依赖项,我就不必更改任何控制器,只需更改基本控制器,这样更易于维护
有没有一种方法可以通过Ninject实现这一点(或者说Unity,我很快就会把它改为Unity),模式/方法是否有一个我还没有听说过的特定名称
public interface IMyServiceContainer
{
IMyService1 MyService1 { get; }
IMyService2 MyService2 { get; }
IMyService3 MyService3 { get; }
}
public class MyServiceContainer
{
public IMyService1 MyService1 { get; private set; }
public IMyService2 MyService2 { get; private set; }
public IMyService3 MyService3 { get; private set; }
public MyServiceContainer(IMyService1 myService1, IMyService2 myService2, IMyService3 myService3)
{
MyService1 = myService1;
MyService2 = myService2;
MyService3 = myService3;
}
}
然后是您的基本控制器:
public class MyBaseController : Controller
{
public MyBaseController(IMyServiceContainer container)
{
Container = container;
}
protected IMyServiceContainer Container { get; private set; }
}
public class MyController : MyBaseController
{
public MyController(IMyServiceContainer container) : base(container)
{
}
public ActionResult MyAction()
{
Container.MyService1.DoSomething();
Container.MyService2.DoSomethingElse();
return View();
}
}
然后导出控制器:
public class MyBaseController : Controller
{
public MyBaseController(IMyServiceContainer container)
{
Container = container;
}
protected IMyServiceContainer Container { get; private set; }
}
public class MyController : MyBaseController
{
public MyController(IMyServiceContainer container) : base(container)
{
}
public ActionResult MyAction()
{
Container.MyService1.DoSomething();
Container.MyService2.DoSomethingElse();
return View();
}
}
现在只剩下配置NInject了:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IMyService1>().To<MyService1>();
kernel.Bind<IMyService2>().To<MyService2>();
kernel.Bind<IMyService3>().To<MyService3>();
kernel.Bind<IMyServiceContainer>().To<MyServiceContainer>();
}
私有静态无效注册服务(IKernel内核)
{
kernel.Bind().To();
kernel.Bind().To();
kernel.Bind().To();
kernel.Bind().To();
}
OK。所以我需要实现服务容器?我不能只在界面上使用它?我想可能有某种内在的东西来处理这件事。。。我不知道我可以添加另一个绑定。你不能实例化接口。实际上,您并不真正需要IMyServiceContainer接口。当然,您可以直接使用MyServiceContainer聚合类。我想在后台正在进行一些实例化。显然,我从未处理过创建的实际类。我要一把小提琴:)@DarinDimitrov你不也需要MyController
的绑定吗?如果您想使用MyController
DI方式,Autofac将此模式称为“聚合服务”