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強大的可擴展性


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM