(精华)2020年7月21日 ASP.NET Core 容器伪属性注入
【摘要】
为 Controller 实现伪属性注入
Controller 默认是不会通过自带容器来 Resolve&Activate 的,是通过MVC自身管理的。可以通过调用 AddControllers...
为 Controller 实现伪属性注入
Controller 默认是不会通过自带容器来 Resolve&Activate 的,是通过MVC自身管理的。可以通过调用 AddControllersAsServices()方法来让 Controller 使用自带容器。
services.AddControllers().AddControllersAsServices();
- 1
AddControllersAsServices源码如下
定义 Controller 基类
Controller 继承基类
改造 Controller 激活器
替换默认 Controller 激活器
services.AddControllers().AddControllersAsServices();
services.Replace(ServiceDescriptor.Transient<IControllerActivator, XcServiceBasedControllerActivator>()); //替换默认 Controller 激活器
- 1
- 2
为 Application Service 实现伪属性注入
只是以 Application Service 来作为讲解,同理可举一反三到其他地方。Application Service 属于领域驱动分层架构中的一层,如不了解,可自行查找资料。
- 1
定义应用服务基类接口
public interface IAppService
{
ILogger Logger { get; set; }
}
public class AppService:IAppService
{
public ILogger Logger { get; set; }
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
定义具体服务,以 User 服务为例
public interface IUserAppService:IAppService
{
void Create();
}
public class UserAppService : AppService,IUserAppService
{
public void Create()
{
Logger.LogInformation("来自 Application Service 的日志");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
定义特殊的注册服务的方法,以便实现 Resolve 为 Logger 赋值
public static class ServiceExtensions
{
public static IServiceCollection AddApplicationService<TService, TImpl>(this IServiceCollection services) where TService:IAppService where TImpl:AppService
{
services.AddApplicationService(typeof(TService), typeof(TImpl));
return services;
}
// 可以反射程序集调用此方法实现批量自动注册应用服务
public static IServiceCollection AddApplicationService(this IServiceCollection services, Type serviceType,Type implType)
{
services.AddTransient(serviceType, sp =>
{
//获取服务实现的实例
var implInstance = ActivatorUtilities.CreateInstance(sp, implType); ;
if (implInstance is AppService obj)
{
//为 Logger 赋值
obj.Logger= sp.GetRequiredService<ILoggerFactory>().CreateLogger(implType);
}
return implInstance;
});
return services;
}
- 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
注册测试服务
文章来源: codeboy.blog.csdn.net,作者:愚公搬代码,版权归原作者所有,如需转载,请联系作者。
原文链接:codeboy.blog.csdn.net/article/details/107491709
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)