.net core 使用Autofac
定义对象生存周期
/// <summary>
/// 瞬时依赖注入
/// </summary>
public interface IInstance
{
}
/// <summary>
/// 单例依赖注入
/// </summary>
public interface ISingleton
{
}
/// <summary>
/// 单次请求依赖注入
/// </summary>
public interface ITransient
{
}
通过反射注册到IOC容器
示例
public static class ContainerBuilder
{
/// <summary>
/// 容器
/// </summary>
public static IContainer Instance;
/// <summary>
/// 自定义注册
/// </summary>
/// <param name="builder"></param>
public static void ContainerRegister(this Autofac.ContainerBuilder builder)
{
// 获取程序集,只能获取到启动程序集,以及框架程序集
var assems = AppDomain.CurrentDomain.GetAssemblies();
//通过程序集名称获取程序集
var realize = Assembly.LoadFrom("Realize.dll");
var assembly = new[] { realize };
assems.Concat(assembly); //合并程序集
//注册所有的实现了IDependency接口的类
foreach (var item in assembly)
{
foreach(Type type in item.GetTypes())
{
if (!type.IsGenericType)
{
if (type.GetInterfaces().Contains(typeof(IInstance)))
{
builder.RegisterType(type).AsImplementedInterfaces().InstancePerDependency(); // 暴露所有的继承接口
}
if (type.GetInterfaces().Contains(typeof(ISingleton)))
{
builder.RegisterType(type).AsImplementedInterfaces().SingleInstance(); // 暴露所有的继承接口
}
if (type.GetInterfaces().Contains(typeof(ITransient)))
{
builder.RegisterType(type).As(type.GetInterfaces().FirstOrDefault()).InstancePerLifetimeScope(); //暴露继承的第一个接口
}
}
else
{
if (type.GetInterfaces().Contains(typeof(IInstance)))
{
builder.RegisterGeneric(type).AsSelf().InstancePerDependency();
}
if (type.GetInterfaces().Contains(typeof(ISingleton)))
{
builder.RegisterGeneric(type).AsSelf().SingleInstance();
}
if (type.GetInterfaces().Contains(typeof(ITransient)))
{
builder.RegisterGeneric(type).AsSelf().InstancePerLifetimeScope();
}
}
}
}
Instance = builder.Build();
}
}
注册方法说明
// 创建注册组件的builder
var builder = new ContainerBuilder();
//根据类型注册组件 ConsoleLogger 暴漏服务:ILogger
builder.RegisterType<ConsoleLogger>().As<ILogger>();
//根据类型注册组件 ConsoleLogger,暴漏其实现的所有服务(接口)
builder.RegisterType<ConsoleLogger>().AsImplementedInterfaces();
// 根据实例注册组件 output 暴漏服务:TextWriter
var output = new StringWriter();
builder.RegisterInstance(output).As<TextWriter>();
//表达式注册组件,这里我们是在构造函数时传参->"musection" 暴漏服务:IConfigReader
builder.Register(c =new ConfigReader("mysection")).As<IConfigReader>();
//表达式注册组件,解析时传参
var service = scope.Resolve<IConfigReader>(
new NamedParameter("section", "mysection"));
//反射注册组件,直接注册了ConsoleLogger类(必须是具体的类),如果ConsoleLogger有多个构造函数,将会取参数最多的那个构造函数进行实例化
builder.RegisterType<ConsoleLogger>();
//反射注册组件,手动指定构造函数,这里指定了调用 MyComponent(ILogger log,IConfigReader config)的构造函数进行注册
builder.RegisterType<MyComponent>()
.UsingConstructor(typeof(ILogger), typeof(IConfigReader));
//注册MySingleton类中的静态变量"Instance",ExternallyOwned()函数指定自己控制实例的生命周期,而不是由autofac自动释放
builder.RegisterInstance(MySingleton.Instance).ExternallyOwned();
//一个组件暴漏两个服务
builder.RegisterType<CallLogger>().As<ILogger>().As<ICallInterceptor>();
//注册当前程序集中以“Service”结尾的类
builder.RegisterAssemblyTypes(System.Reflection.Assembly.GetExecutingAssembly()).Where(t => t.Name.EndsWith("Service")).AsImplementedInterfaces();
//注册"MyApp.Repository"程序集中所有的类
builder.RegisterAssemblyTypes(GetAssembly("MyApp.Repository")).AsImplementedInterfaces();
//构建一个容器完成注册
var rootcontainer = builder.Build();
//可以通过下面这种方式手动获取IConfigReader 的实现类
//这种手动解析的方式需要 从生命周期作用域内获取组件,以保证组件最终被释放
//不要直接从根容器rootcontainer中解析组件,很有可能会导致内存泄漏
using(var scope = rootcontainer.BeginLifetimeScope())
{
var reader = scope.Resolve<IConfigReader>();
}
替换.net core的IOC容器为autofac
控制台以及windows应用替换方法
var builder = new Autofac.ContainerBuilder();
builder.ContainerRegister();
MVC
待完成
web(非MVC架构)
待完成
使用方法
从容器中解析
// 使用using避免内存泄露
using (var scope =IRepository.ContainerBuilder.Instance.BeginLifetimeScope())
{
_lolconfig = scope.Resolve<>();
}
// 直接解析
ContainerBuilder.Instance.Resolve<ILOLConfig>();
构造注入
待完成