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.
103 lines
4.1 KiB
103 lines
4.1 KiB
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; |
|
} |
|
} |
|
}
|
|
|