没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
全文可编辑 word 文档 页眉与背景水印可删除
1
在.net core 中实现字段和属性注入的示例
代码
简单来说,使用 Ioc 模式需要两个步骤,第一是把服务
注册到容器中,第二是从容器中获取服务,我们一个一个讨
论并演化。这里不会考虑使用如 Autofac 等第三方的容器来
代替默认容器,只是提供一些简单实用的小方法用于简化应
用层的开发。
将服务注入到容器
asp.netcore 官方给出的在容器中注册服务方法是,要
在 Startup 类的 ConfigureServices 方法中添加服务,如下
所示:
public void ConfigureServices(IServiceCollection
services)
{
services.AddMvc();
services.AddSingleton(typeof(UserService));
services.AddSingleton(typeof(MsgService));
services.AddSingleton(typeof(OrderService))
全文可编辑 word 文档 页眉与背景水印可删除
2
;
}
AddMvc 方法添加了 mvc 模块内部用到的一些服务,这个
是封装好的,一句话就行了,其他第三方组件也都提供了类
似的 Add 方法,把自己内部需要的服务都封装好注册进去了。
但是我们应用开发人员使用的类,还是需要一个一个写进去
的,大家最常见的三层架构中的数据访问层和业务逻辑层便
是此类服务,上面代码中我加入了三个业务服务类。这显然
不是长久之计,我想大家在开发中也会针对此问题做一些处
理,这里说下我的,仅供参考吧。
解决方法就是批量注册!说到批量,就需要一个东西来
标识一批东西,然后用这一个东西来控制这一批东西。
在.net 程序的世界中,有两个可选的角色,一个是接口
Interface,另一个是特性 Attribute。
如果使用接口作为标识来使用,限制就太死板了,一个
标识的信息不是绝对的单一,是不推荐使用接口的,因为可
能需要引入多个接口才能共同完成,所以我选择特性作为标
识。特性相较与接口有什么特点呢?特性在运行时是类的实
例,所以可以存储更多的信息。
下面我们简单实现一个 AppServiceAttribute:
/// <summary>
/// 标记服务
全文可编辑 word 文档 页眉与背景水印可删除
3
/// </summary>
[AttributeUsage(AttributeTargets.Class,
Inherited = false)]
public class AppServiceAttribute : Attribute
{
}
这个特性类取名 AppService 有两个理由,一是指定是应
用层的服务类,二是避免使用 Service 这样的通用命名和其
他类库冲突。
有了标识,就可以批量处理了,我们在一个新的类中给
IServiceCollection 提供一个扩展方法,用来批量添加标记
有 AppService 特性的服务到容器中。
public static class AppServiceExtensions
{
/// <summary>
/// 注册应用程序域中所有有 AppService 特性的
服务
/// </summary>
/// <param name="services"></param>
public static void AddAppServices(this
IServiceCollection services)
{
全文可编辑 word 文档 页眉与背景水印可删除
4
foreach (var assembly in
AppDomain.CurrentDomain.GetAssemblies())
{
foreach (var type in
assembly.GetTypes())
{
var serviceAttribute =
type.GetCustomAttribute<AppServiceAttribute>();
if (serviceAttribute != null)
{
services.AddSingleton(type)
;
}
}
}
}
}
我们遍历应用程序中所有程序集,然后嵌套遍历每个程
序集中的所有类型,判断类型是否有 AppService 特性,如
果有的话就添加到容器中,这里有点不自信哦,为什么呢,
因为我是使用 AddSingleton 方法以单例模式将服务添加到
剩余25页未读,继续阅读
资源评论
mmoo_python
- 粉丝: 0
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功