Sorry, we have not updated this series of articles on vacation recently. I originally wanted to write about NuGet first, but I think NuGet does not have to spend too much time for everyone. I 'd like to know about DI in ASP. NET MVC 3 first.
ASP. net mvc 3.0 Learning Series-Preface
ASP. net mvc 3.0 Learning Series -- Razor and ASP. net mvc 3.0
ASP. net mvc 3.0 Learning Series-Controllers in ASP. net mvc 3.0
ASP. net mvc 3.0 Learning Series-Model in ASP. net mvc 3.0
This article mainly introduces the following content:
1. Introduction
Developers who have worked for DI for more than three years should be familiar with DI. If you are a beginner developer, I suggest you take a look at the materials and learn about DI and related concepts. Read the following:
Http://en.wikipedia.org/wiki/Dependency_injection
Http://en.wikipedia.org/wiki/Abstract_factory
Http://martinfowler.com/articles/injection.html#UsingAServiceLocator
In ASP. in versions earlier than net mvc 3, Abstract Factory and Service Locator are used as DI containers. In 3, you can use the new Dependency Resolver to combine the Container tool to implement DI more easily.
2. Dependency Resolution
What is Dependency Resolution?
A Controller requires a Repository, so this Repository is a dependency of the Controller.
The above is a traditional Deoendency example (in code ).
The Dependency Reolver is provided in ASP. net mvc 3, which provides us with a good Dependency Resolution.
When a component is required in the request, the Dependency Resolver will provide a corresponding control T.
3. Benefits
What are the advantages of Dependency Resolution?
A. Flexibility
Make the entire system architecture more flexible. Developers can focus more on architecture rather than function implementation.
B. Testability
This makes testing of the entire system easier. The test part and specific functional implementation dependencies are much smaller.
C. Extensibility
Enhanced scalability.
4. Use of IdependencyResolver
The DependencyResolver is a member of the System. web. mvc NameSpace and its job is quite simple: to provide a central registration point for your chosen IoC Container. prior to MVC 3, we often dealt with our chosen IoC container directly. in MVC 3, there is an independent action layer (the DependencyResolver Class) that we will interact with directly. whether your chosen IoC Container is Windsor, StructureMap or Unity, you can take advantage of this new feature.
The IdependencyResolver interface has two methods:
object GetService(Type serviceType) IEnumerable<object> GetServices(Type serviceType)
How to use it is generally used in combination with an IoC Container.
Here are several examples:
Combined with Autofac:
I prefer Autofac, but I found that it is relatively complicated to use Autoc with IdependencyResolver. Research is required.
Combined with StructureMap:
1. public class StructureMapDependencyResolver : IDependencyResolver 2. { 3. IContainer _container; 4. 5. public StructureMapDependencyResolver(IContainer container) 6. { 7. _container = container; 8. } 9. 10. 11. public object GetService(Type serviceType) 12. { 13. object instance = _container.TryGetInstance(serviceType); 14. 15. if (instance == null && !serviceType.IsAbstract) 16. { 17. _container.Configure(c => c.AddType(serviceType, serviceType)); 18. instance = _container.TryGetInstance(serviceType); 19. } 20. 21. return instance; 22. } 23. 24. public IEnumerable<object> GetServices(Type serviceType) 25. { 26. return _container.GetAllInstances(serviceType).Cast<object>(); 27. } 28. }
Combined with Unity:
1. public class UnityDependencyResolver : IDependencyResolver 2. { 3. IUnityContainer _container; 4. 5. public UnityDependencyResolver(IUnityContainer container) 6. { 7. _container = container; 8. } 9. 10. public object GetService(Type serviceType) 11. { 12. object instance; 13. try 14. { 15. instance = _container.Resolve(serviceType); 16. if (serviceType.IsAbstract || serviceType.IsInterface) 17. { 18. return null; 19. } 20. return instance; 21. } 22. catch (Exception e) 23. { 24. return null; 25. } 26. } 27. 28. public IEnumerable<object> GetServices(Type serviceType) 29. { 30. return _container.ResolveAll(serviceType); 31. } 32. }
Combined with NInject:
public class NinjectDependencyResolver : IDependencyResolver { private readonly IKernel _kernel; public NinjectDependencyResolver(IKernel kernel) { _kernel = kernel; } public object GetService(Type serviceType) { return _kernel.TryGet(serviceType, new IParameter[0]); } public IEnumerable<object> GetServices(Type serviceType) { return _kernel.GetAll(serviceType, new IParameter[0]); } }
The next step is to Register Service at Application Start and set Resolver.
StructureMap:
# IContainer container = new Container(# x =># {# x.For<SomeService>().# Use<SomeService>().# WithCtorArg("stringResponse").# EqualTo("IoC Container: StructureMap.");# # x.For<HomeController>().Use<HomeController>();# });# DependencyResolver.SetResolver(new StructureMapDependencyResolver(container));
Unity:
## var container = new UnityContainer();# # container# .RegisterType<SomeService, SomeService>().# Configure<InjectedMembers>().ConfigureInjectionFor# <SomeService>(new InjectionConstructor("IoC Container: Unity."));# # container.RegisterType<HomeController, HomeController>();# # DependencyResolver.SetResolver(new UnityDependencyResolver(container));
NInject:
var kernel = new StandardKernel(); kernel.Bind<IMessenger>().To<SmsMessenger>(); kernel.Bind<IFilterProvider>().To<MessagingFilterProvider>(); DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
5. Controller Injection:
6. View Injection:
You can read this article: http://www.lostechies.com/blogs/johnvpetersen/archive/2011/01/24/dependency-injection-in-mvc-3-with-views.aspx
For more information about Activator and ViewEngine.
Nick