Autofac 批量注入

如果有很多实现接口需要用到autofac进行注入,是不是需要调用ContainerBuilder.RegisterType()这个方法很多次?那有没有一个偷懒的方法呢?只需要三四行代码就可以实现所有接口的注入呢?有的

第一步:创建如下这样一个空接口

 public interface IDenpendency
    {
    }

接口名称可以随便取

第二步:创建需要注入到autofac容器里的功能接口,这类接口就是你想实现某些功能的封装,它们都有一个共同的特点:继承第一步创建的接口IDenpendency,如下,我创建一个功能接口

public interface IFunction1:IDenpendency
    {
        string GetName();
    }

这个接口你可以添加任何你想要实现的方法声明

第三步:有了接口,我们就需要实现这些接口了,如下,我创建了一个实现IFunction1的类

public class Funciton1 : IFunction1
    {
        public string GetName()
        {
            return "功能点1";
        }
    }

好了,到了这里,我们已经把基本用到的零件都构建好了,现在只剩下把这些零件给组装到autofac容器里面了

第四步:将接口注入到容器里面

 public static ContainerBuilder Register()
        {
            var builder = new ContainerBuilder();          

            Type basetype = typeof(IDenpendecy);
            builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
                .Where(t => basetype.IsAssignableFrom(t) && t.IsClass)
                .AsImplementedInterfaces().InstancePerLifetimeScope();
            return builder;
        }

上面的代码里面有一个关键点:Type basetype = typeof(IDenpendecy);

第五步:测试

static void Main(string[] args)
        {
            var builder= AutofacRegister.Register();
            using (var container = builder.Build())
            {
               
                IFunction1 function1 = container.Resolve<IFunction1>();
                Console.WriteLine(function1.GetName());
              
            }
            Console.Read();
        }

结果截图:

这里要讲一下第一步我为什么要创建一个IDenpendecy这样的一个空接口,我们在第四步可以看到,我们是在我们当前程序运行的程序集里面找到所有继承于IDenpendecy这个接口的类的,把这些实现类注入到autofac容器里面的。这里就要讲一下这样做到的思路:只要是想把接口注入到autofac容器中,那么这个接口就要继承IDenpendecy这个接口,我们在第四步就是根据有没有继承IDenpendecy这个接口条件来筛选需要注入到容器的接口。所以这里我们还可以用另外一种实现方式来实现:创建自定义属性,然后把需要实现注入的接口都加上这个属性即可。

总结:实际上上面实现的方式,归纳一点就是通过反射来找到所有自定义的接口然后将这些接口注入到容器中,实现一次性注入所有接口的目的,上面第四步我是取的当前运行的程序所在的程序集,实际上我们可以通过配置文件实现可配置化,这样我们想要用哪个dll来实现业务功能,直接修改配置文件就可以,这样更灵活

以上是我的一个很浅显简单的应用总结,方便以后用到的时候可以直接拷贝代码,不用再去网上漫天查找资料,具体的实现原理,可以看一下autofac源码,这里给出两个参考的博客连接:http://niuyi.github.io/blog/2012/04/06/autofac-by-unit-test/

https://www.cnblogs.com/ingstyle/p/6655883.html

 

在使用 Autofac 进行批量依赖注入时,可以使用 Autofac 的 `RegisterAssemblyTypes` 方法实现。 首先,需要在程序集中标记需要注入的类型,可以使用 `Autofac.Module` 类进行实现。例如: ```csharp using Autofac; public class MyModule : Autofac.Module { protected override void Load(ContainerBuilder builder) { builder.RegisterType<MyService>().As<IMyService>(); builder.RegisterType<MyRepository>().As<IMyRepository>(); // 注册其他需要注入的类型 } } ``` 然后,在 `Global.asax.cs` 文件中,使用 `ContainerBuilder` 类创建容器,并把需要注入的模块注册进去。例如: ```csharp using Autofac; using Autofac.Integration.WebApi; using System.Reflection; using System.Web.Http; public class WebApiApplication : System.Web.HttpApplication { protected void Application_Start() { var builder = new ContainerBuilder(); builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); builder.RegisterAssemblyModules(Assembly.GetExecutingAssembly()); var container = builder.Build(); GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container); } } ``` 这样,就可以实现批量依赖注入了。在需要使用注入的类型时,可以通过构造函数注入或属性注入的方式获取实例。例如: ```csharp public class MyController : ApiController { private readonly IMyService _myService; public MyController(IMyService myService) { _myService = myService; } [HttpGet] public IHttpActionResult MyAction() { // 使用 MyService return Ok(); } } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值