Why
- 因为最近我自己打算开始一个新项目了,需要使用到依赖注入,之前我使用的也是
Autofac
,公司的依赖注入就是我写的,但是之前没有写成博客,这次正好记录一下。
How
安装
- 直接使用
VS
的Nuget
安装,推荐以下两个都安装。

代码部分
- 因为我比较喜欢直接使用
dll
进行注册,同时添加自定义的Attribute
,实现加载的类过滤,同时需要注册继承的接口。
- 自定义
Attribute
public enum LoadEnum
{
Singleton,
InstancePerLifetimeScope,
InstancePerDependency,
}
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class LoadAttribute : Attribute
{
public LoadEnum LoadType => loadType;
private LoadEnum loadType;
public LoadAttribute(LoadEnum loadType = LoadEnum.Singleton)
{
this.loadType = loadType;
}
}
public static class LoadHelper
{
public static IContainer? Container => container;
private static ContainerBuilder? builder;
private static IContainer? container;
public static bool Load(string dllName)
{
try
{
var assembly = Assembly.LoadFrom(dllName);
builder = new ContainerBuilder();
foreach (Type type in assembly.GetTypes())
{
var loadAttribute = type.GetCustomAttribute<LoadAttribute>();
if (loadAttribute == null)
continue;
var interfaces = type.GetInterfaces();
switch (loadAttribute.LoadType)
{
case LoadEnum.Singleton:
{
builder.RegisterType(type).SingleInstance().As(interfaces).AsSelf();
}
break;
case LoadEnum.InstancePerLifetimeScope:
{
builder.RegisterType(type).InstancePerLifetimeScope().As(interfaces).AsSelf();
}
break;
case LoadEnum.InstancePerDependency:
{
builder.RegisterType(type).InstancePerDependency().As(interfaces).AsSelf();
}
break;
default:
break;
}
}
}
catch (Exception ex)
{
LoggerHelper.Error(ex);
return false;
}
return true;
}
public static void Build()
{
container = builder?.Build();
}
}
- 注意其中的
LoggerHelper
是日志类,可以忽略或者注释。
- 使用示例(仅作参考,可以自行操作)
LoadHelper.Load("PQSoft.dll");
LoadHelper.Build();
var iLoad = LoadHelper.Container.Resolve<ILoad>();
Tips
- 注意,在依赖注入的时候其实是有顺序要求的,我目前测试的只有这种方法可以同时注册其本身类和所有的接口。
- 很简单,仅做记录,以后自己方便使用。