|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|