zoukankan      html  css  js  c++  java
  • 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强大的可扩展性

  • 相关阅读:
    百度地图引用
    【转,待验证】HTML文件中也玩include文件包含
    【转】php.ini 里加载的DLL文件 中文说明
    iOS 申请账号使用的邓白氏网址 (免费)
    Xcode 插件
    关于时间的
    mac 终端命令集合
    2015年3月苹果新的审核标准(PDF)
    2015年3月苹果新的审核标准(中文)
    2015年3月苹果新的审核标准(英文)
  • 原文地址:https://www.cnblogs.com/miku/p/2862675.html
Copyright © 2011-2022 走看看