在使用Autofac实现IOC注入,参考了网上大部分的DEMO,发现很多都是先从Global全局通过RegisteredType来注入,然后在Mvc 控制器l里面通过Resolved获取实例
--注入部分
1 protected void Application_Start() 2 { 3 var builder = new ContainerBuilder(); 4 SetupResolveRules(builder); 5 6 builder.RegisterControllers(Assembly.GetExecutingAssembly()); 7 var container = builder.Build(); 8 DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 9 10 } 11 12 --获取 13 14 private static IContainer _container; 15 private static void Main(string[] args) 16 { 17 InitIoC(); 18 19 var lister = _container.Resolve<MPGMovieLister>(); 20 21 foreach (var movie in lister.GetMPG()) 22 { 23 Console.WriteLine(movie.Name); 24 } 25 Console.Read(); 26 } 27 28 29 private static void InitIoC() 30 { 31 var builder = new ContainerBuilder(); 32 builder.RegisterType<ListMovieFinder>().AsImplementedInterfaces(); 33 builder.RegisterType<MPGMovieLister>(); 34 _container = builder.Build(); 35 }
以上DEMO ,Containe的作用范围都仅在当前块内且每次都先Init初始化,假如我不是在Control里面获取实例,而是想在业务逻辑层里面获取实例对象(Resolver),我应该怎样获取到IOC 容器对象( IContainer)
暂时想到的方法有
1.通过静态变量 但是在IIS回收的时候可能得重新Init
2.每次都重新注入Registered 初始化容器,但是感觉这样会消耗性能
求有优雅一点的实现方式~
用ioc了.就走上结构设计的道路.就别想这种级别的消耗性能了.
而应该在怎么把结构做的更好上下心思.
想学IOC我强烈推荐 orchard 项目.把源码下下来.学习他的设计思路.
x谢谢
又见大神,orchard的确是一个微软爸爸做的Autofac的很好的范本,可以参考一下。
你这个代码贴的我看的有点懵,又是MVC又是Main...你用的Core么?Autofac在Fx和Core上的实现是不太一样的
我们先说Fx吧。
在项目启动的时候就像题主贴的代码一样,对接口或类进行注册
protected void Application_Start() { var builder = new ContainerBuilder(); #region All registration //do something... #endregion //注册当前项目下所有控制器 builder.RegisterControllers(Assembly.GetExecutingAssembly()); DependencyResolver.SetResolver(builder.Build()); }
注意一下 builder.RegisterControllers ,我们注册了当前项目下所有的控制器,在请求响应管道中实例化控制器类的时候,我们可以根据注册的控制器来判断是否需要注入。
但是题主你没有理解 DependencyResolver 的意义。这个组件本来就是原生MVC中的一个重要组件,通过名称就可以看出来它本来就是负责IOC的。
但是题主你的这段代码 DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); ,让人感觉有点哭笑不得,本来生成一个容器了,然后又把这个容器放到了一个另外一个容器里,然后在下面的代码中,使用 DependencyResolver 来反转一个 AutofacDependencyResolver ,再到这个手动找我要的代码?
向我上面那样,直接将Autofac的容器放到MVC本身的IOC容器里就可以。
然后回到控制器
注入就变得优雅的多
public class TestController : Controller { private readonly IMyInterface _iMyInterface; public TestController(IMyInterface iMyInterface) { _iMyInterface = iMyInterface; } }
在控制器实例化的时候,我们管道中的IOC会根据控制器默认构造函数中的参数类型来进行反转。
容器只有在项目启动的时候进行一次初始化注册,直到当前项目进程结束。在每次请求进来的时候,只进行反转就可以了。
推荐题主两篇文章
理解ASP.NET MVC的DependencyResolver组件
另外有些注册服务器,他们所需要的域或者生存周期不同,可以看下这个
Core的我就先不写了...虽然跟Fx的机制不太一样,但是理解了Fx的再理解Core就不难了