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强大的可扩展性

  • 相关阅读:
    CV baseline之VGG
    CV baseline之Alexnet
    Colab踩得坑
    CV baseline之ResNet
    轻量模型之Distilling the Knowledge in a Neural Network
    轻量模型之Xception
    用Rapidminer做文本挖掘的应用:情感分析
    R语言缺失值的处理:线性回归模型插补
    R语言如何解决线性混合模型中畸形拟合(Singular fit)的问题
    数据类岗位需求的数据面
  • 原文地址:https://www.cnblogs.com/miku/p/2862675.html
Copyright © 2011-2022 走看看