MEF实现设计上的“松耦合”(四):构造函数注入
前言:今天十一长假的第一天,本因出去走走,奈何博主最大的乐趣是假期坐在电脑前看各处堵车,顺便写写博客,有点收获也是好的。关于MEF的知识,之前已经分享过三篇,为什么有今天这篇?是因为昨天分享领域服务的时候,用到MEF的注入有参构造函数的方法,博主好奇心重,打算稍微深挖一下,这篇来对此知识点做个总结。
还是将前面三篇的目录列出来,对MEF没有了解的朋友,可以先看看:
一、知识点回顾我们知道MEF作为IOC的方式之一,它的主要作用是解耦,MEF加上面向接口编程,可以使得你的设计更加灵活。我们知道类的构造函数是可以重载的,我们通过构造函数可以向对象传递参数。那么如果我们的MEF也需要通过构造函数传参怎么办呢?别担心,有我们神奇的ImportingConstructor为您解决。
二、代码示例作为分享代码,博主还是打算用前面DDD里面领域服务用到的那个Demo,现学现卖嘛,O(∩_∩)O~
1、准备代码:作为MEF的导入导出的对象,我们先来看三个仓储接口和实现
public interface IUserRepository:IRepository<TB_USERS> { IEnumerable<TB_USERS> GetUsersByRole(TB_ROLE oRole); }
[Export(typeof(IUserRepository))] public class UserRepository:EFBaseRepository<TB_USERS>,IUserRepository { public IEnumerable<TB_USERS> GetUsersByRole(TB_ROLE oRole) { throw new NotImplementedException(); } }
public interface IRoleRepository:IRepository<TB_ROLE> { }
[Export(typeof(IRoleRepository))] public class RoleRepository:EFBaseRepository<TB_ROLE>,IRoleRepository { }
public interface IUserRoleRepository : IRepository<TB_USERROLE> { }
[Export(typeof(IUserRoleRepository))] public class UserRoleRepository : EFBaseRepository<TB_USERROLE>, IUserRoleRepository { }
2、构造函数传入单个参数直接来看代码吧:
[Export(typeof(IPowerManagerDomainService))] public class PowerManagerDomainService:IPowerManagerDomainService { private IUserRepository _userRepository = null; private IRoleRepository _roleRepository = null; private IUserRoleRepository _userroleRepository = null; [ImportingConstructor] public PowerManagerDomainService(IUserRoleRepository oUserRoleRepository) { _userroleRepository = oUserRoleRepository; } }
为什么通过这里的ImportingConstructor特性就能将参数IUserRoleRepository oUserRoleRepository顺利传进来?还记得前面的准备代码吗,IUserRoleRepository的实现类UserRoleRepository上面标记过导出[Export(typeof(IUserRepository))],,所以这里能将参数顺利导入进来。还是来看看调用代码:
[Import] public IPowerManagerDomainService powerDomainService { get; set; } static void Main(string[] args) { var oProgram = new Program(); Regisgter.regisgter().ComposeParts(oProgram); Console.ReadKey(); }
来调试代码看看:
3、构造函数传入多个参数其实多个参数和上面单个参数的的也没啥太大区别
[ImportingConstructor] public PowerManagerDomainService(IUserRepository oUserRepository, IRoleRepository oRoleRepository) { _userRepository = oUserRepository; _roleRepository = oRoleRepository; }
同样要求IUserRepository 和 IRoleRepository 类型要有对应的Export。
4、构造函数参数有多个导出上面的例子都是默认仓储的接口类型都只有一个导出的情况,当实际项目中,业务逻辑较复杂的时候,某一个接口往往存在多个实现类的导出,这种情况下我们要怎么办呢?比如IUserRepository仓储接口有两个实现类:
[Export("userRepository_A", typeof(IUserRepository))] public class UserRepository_A:EFBaseRepository<TB_USERS>,IUserRepository { public IEnumerable<TB_USERS> GetUsersByRole(TB_ROLE oRole) { throw new NotImplementedException(); } }
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/66771.html
- 上一篇:C#.net支付宝接口
- 下一篇:運行程式時提示丟失api