消防站文档解析
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

104 lines
4.1 KiB

2 years ago
using Autofac;
using Autofac.Extras.DynamicProxy;
using Infrastructure.Abstructions;
using Infrastructure.Application;
using Infrastructure.Domain;
using Microsoft.Extensions.DependencyModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.Loader;
using System.Text;
namespace Infrastructure.AutofacInjection
{
public class AutofacModule: Autofac.Module
{
protected override void Load(ContainerBuilder builder)
{
var assemblies = GetCompilationLibraries(builder);
InjectDomainService(builder, assemblies);
InjectApplicationService(builder, assemblies);
InjectServices(builder, assemblies);
}
private void InjectServices(ContainerBuilder builder, List<Assembly> assemblyList)
{
builder.RegisterAssemblyTypes(assemblyList.ToArray())
.Where(type => typeof(ITransientDependency).IsAssignableFrom(type) && !type.IsAbstract)
.AsImplementedInterfaces()
.AsSelf()
.InstancePerDependency();
builder.RegisterAssemblyTypes(assemblyList.ToArray())
.Where(type => typeof(IScopedDependency).IsAssignableFrom(type) && !type.IsAbstract)
.AsImplementedInterfaces()
.AsSelf()
.InstancePerLifetimeScope();
builder.RegisterAssemblyTypes(assemblyList.ToArray())
.Where(type => typeof(ISingletonDependency).IsAssignableFrom(type) && !type.IsAbstract)
.AsImplementedInterfaces()
.AsSelf()
.SingleInstance();
}
private void InjectApplicationService(ContainerBuilder builder, List<Assembly> assemblyList)
{
//单独注册appservice是为了启用属性注入
builder.RegisterAssemblyTypes(assemblyList.ToArray())
.Where(type => typeof(IApplicationService).IsAssignableFrom(type) && !type.IsAbstract)
.AsImplementedInterfaces()
.EnableInterfaceInterceptors()
.PropertiesAutowired()
.InstancePerDependency();
builder.RegisterAssemblyTypes(assemblyList.ToArray())
.Where(type => typeof(ApplicationService).IsAssignableFrom(type) && !type.IsAbstract)
.AsSelf()
.EnableClassInterceptors()
.PropertiesAutowired()
.InstancePerDependency();
}
private void InjectDomainService(ContainerBuilder builder, List<Assembly> assemblyList)
{
//单独注册领域服务是为了开启领域服务的业务编织和属性注入
builder.RegisterAssemblyTypes(assemblyList.ToArray())
.Where(type => typeof(IDomainService).IsAssignableFrom(type) && !type.IsAbstract)
.AsImplementedInterfaces()
.EnableInterfaceInterceptors()
.PropertiesAutowired()
.InstancePerDependency();
builder.RegisterAssemblyTypes(assemblyList.ToArray())
.Where(type => typeof(DomainService).IsAssignableFrom(type) && !type.IsAbstract)
.AsSelf()
.EnableClassInterceptors()
.PropertiesAutowired()
.InstancePerDependency();
}
private List<Assembly> GetCompilationLibraries(ContainerBuilder builder)
{
var compilationLibrary = DependencyContext.Default
.CompileLibraries
.Where(x => !x.Serviceable
&& x.Type == "project")
.ToList();
List<Assembly> assemblyList = new List<Assembly>();
foreach (var _compilation in compilationLibrary)
{
try
{
assemblyList.Add(AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(_compilation.Name)));
}
catch (Exception ex)
{
Console.WriteLine(_compilation.Name + ex.Message);
}
}
return assemblyList;
}
}
}