步骤如下: 1.获取所有相关业务程序集 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 publ
标签:
原文:NetCore3.0实现自界说IOC容器注入在之前的ASP.NET MVC实现依赖注入一文中,通过替换默认的ControllerFactory来到达对Controller生命周期的拦截,实现自界说的东西注入,在NetCore3.0中需要从头实现,,法式如下:
1.获取所有相关业务措施集
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static List<Assembly> GetFrameworkAssemblys()
{
var list = new List<Assembly>();
var deps = DependencyContext.Default;
var libs = deps.CompileLibraries;
foreach (var lib in libs)
{
if (!lib.Serviceable && lib.Type != "package" && lib.Name.StartsWith("FastCloud"))
{
var assembly = AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(lib.Name));
list.Add(assembly);
}
}
return list;
}
2.对所有Component组件注册
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class InjectContext
{
private static ContainerBuilder Container;
public static void Init()
{
InjectFrameWork();
}
public static void InjectFrameWork()
{
Container = new ContainerBuilder();
//获框架取所有措施集
List<Assembly> assemblies = CloudUtil.GetFrameworkAssemblys();
//注入框架所有Component组件
Container.RegisterAssemblyTypes(assemblies.ToArray(), typeof(Component), true);
Container.Build(CotainerEnum.BuidlModel.OverWrite);
}
public static object Resolve(Type Type, CotainerEnum.TypeEqual TypeEqual = CotainerEnum.TypeEqual.Ref)
{
return Container.Resolve(Type, TypeEqual);
}
public static List<Type> GetRegistType(Type @Type)
{
return Container.GetRegistType(@Type);
}
}
3.实现自界说Controller工厂
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class CloudControllerActivator : IControllerActivator
{
public object Create(ControllerContext context)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
if (context.ActionDescriptor == null)
{
throw new ArgumentException(nameof(ControllerContext.ActionDescriptor));
}
var controllerTypeInfo = context.ActionDescriptor.ControllerTypeInfo;
if (controllerTypeInfo == null)
{
throw new ArgumentException(nameof(context.ActionDescriptor.ControllerTypeInfo));
}
Type controllerType = controllerTypeInfo.AsType();
return InjectContext.Resolve(controllerType);
}
public void Release(ControllerContext context, object controller)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
if (controller == null)
{
throw new ArgumentNullException(nameof(controller));
}
var disposable = controller as IDisposable;
if (disposable != null)
{
disposable.Dispose();
}
}
}
4.改削配置,使用自界说Controller工厂
1
2
3
4
5
6
7
//替换默认Controller工厂
var defaultActivator = services.FirstOrDefault(c => c.ServiceType == typeof(IControllerActivator));
if (defaultActivator != null)
{
services.Remove(defaultActivator);
}
services.AddSingleton<IControllerActivator, CloudControllerActivator>();
NetCore3.0实现自界说IOC容器注入
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/30503.html