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

你可能感兴趣的:(controller)