MVC扩展(ControllerFactory VS DependencyResolver)

MVC中两种实现DI的办法 ControllerFactory & DependencyResolver

具体请参照

DependencyResolver是MVC3中新增的专门用于实现DI的类。比起ControllerFactory

1.实现代码更简单,职责更清晰。

2.各种主流的IOC容器都实现了自己的IDependencyResolver,与MVC集成更容易。如果IDependencyResolver。自己实现一个也非常简单

使用spring.net实现IDependencyResolver。

public class SpringDependencyResolver : IDependencyResolver{

    private IApplicationContext springContext;

    public SpringDependencyResolver(IApplicationContext context){
        springContext = context;
    }

    public object GetService (Type serviceType){
        IDictionaryEnumerator di = springContext.GetObjectsOfType(serviceType).GetEnumerator();

        di.MoveNext();
        try{
            return di.Value;
        }catch(InvalidOperationException ioe){
            return null;
        }

    public IEnumerable<object> GetServices(Type serviceType){
        IDictionary dictionary = springContext.GetObjectsOfType(serviceType);
        return dictionary.Cast<object>();
    }
}

其他IOC容器。ninject ,autofac,Unity 都实现了自己的DependencyResolver

实现Demo

Global.asax 注意AutofacDependencyResolverNinjectDependencyResolver

protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);

            NinJectResolver();
            //AutofacResolver();
        }

        private void AutofacResolver()
        {
            var builder = new ContainerBuilder();
            builder.RegisterType<MyService>().As<IService>();
            builder.RegisterControllers(typeof(MvcApplication).Assembly);
            var container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        }

        private void NinJectResolver()
        {
            IKernel kernel = new StandardKernel();
            kernel.Bind<IService>().To<MyService>();
            DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
        }

分别用Ninject和Autofac实现DI。

Service:接口和实现

public interface  IService
    {
        string Get();
    }

    public class MyService :IService
    {
        public string Get()
        {
            return "Hello World";
        }
    }

Controller

public class HomeController : Controller
    {
        private IService _service;
        public HomeController(IService service)
        {
            _service = service;
        }

        public ActionResult Index()
        {
            ViewBag.Message = _service.Get();
            return View();
        }

        public ActionResult About()
        {
            return View();
        }
    }

Controller构造器注入Service。

下载Demo

总结:就这样非常容易的实现了DI。都要归功于MVC强大的可扩展性

原文地址:https://www.cnblogs.com/miku/p/2862675.html