如果有很多实现接口需要用到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来实现业务功能,直接修改配置文件就可以,这样更灵活
实际上程序是很很多项目,如图:
所以需要单独 注册每个dll的程序集:
var builder = new ContainerBuilder();
Type basetype = typeof(IOC.IDenpendecy);
builder.RegisterAssemblyTypes(Assembly.GetAssembly(typeof(IService)))
.Where(t => basetype.IsAssignableFrom(t) && t.IsClass)
.AsImplementedInterfaces().InstancePerLifetimeScope();
builder.RegisterAssemblyTypes(Assembly.GetAssembly(typeof(IRespository)))
.Where(t => basetype.IsAssignableFrom(t) && t.IsClass)
.AsImplementedInterfaces().InstancePerLifetimeScope();