首页 新闻 会员 周边

Autofac 使用方法

0
悬赏园豆:30 [已解决问题] 解决于 2019-08-12 18:54

在使用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 初始化容器,但是感觉这样会消耗性能

 

求有优雅一点的实现方式~

下个路口的主页 下个路口 | 初学一级 | 园豆:71
提问于:2018-05-08 21:00
< >
分享
最佳答案
1

用ioc了.就走上结构设计的道路.就别想这种级别的消耗性能了.

而应该在怎么把结构做的更好上下心思.

想学IOC我强烈推荐  orchard 项目.把源码下下来.学习他的设计思路.

收获园豆:10
吴瑞祥 | 高人七级 |园豆:29449 | 2018-05-08 22:02

x谢谢

87Super | 园豆:107 (初学一级) | 2018-05-09 09:16

又见大神,orchard的确是一个微软爸爸做的Autofac的很好的范本,可以参考一下。

写代码的相声演员 | 园豆:517 (小虾三级) | 2018-05-09 10:01
其他回答(1)
0

你这个代码贴的我看的有点懵,又是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组件

另外有些注册服务器,他们所需要的域或者生存周期不同,可以看下这个

IoC~高效的Autofac

 

Core的我就先不写了...虽然跟Fx的机制不太一样,但是理解了Fx的再理解Core就不难了

收获园豆:20
写代码的相声演员 | 园豆:517 (小虾三级) | 2018-05-09 09:57
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册