如何配置Unity为FaxService构造函数注入字符串与IFaxProvider实例
Unity配置FaxService构造函数参数的实用方案
嘿,这个场景我刚好处理过,不用修改FaxService的构造函数,Unity有两种直接的方式可以给它的两个构造参数分别注入字符串和IFaxProvider实例,下面给你一步步演示:
方案一:直接用InjectionConstructor指定参数值
这是最直观的方式,注册FaxService时显式告诉Unity构造函数的每个参数该用什么值:
class Program { static void Main(string[] args) { var container = new UnityContainer(); // 先注册IFaxProvider的具体实现(假设你用的是ConcreteFaxProvider) container.RegisterType<IFaxProvider, ConcreteFaxProvider>(); // 注册FaxService,通过InjectionConstructor明确指定两个参数 container.RegisterType<FaxService>( new InjectionConstructor( "123-456-7890", // 直接传入目标电话号码字符串 new ResolvedParameter<IFaxProvider>() // 让Unity自动解析已注册的IFaxProvider实例 ) ); // 现在解析就能得到正确注入的FaxService了 var faxService = container.Resolve<FaxService>(); } }
如果你的电话号码需要从配置文件读取,把硬编码的字符串换成ConfigurationManager.AppSettings["FaxPhoneNumber"]这类读取逻辑就行,完全不用动FaxService的代码。
方案二:用命名实例管理字符串参数
如果这个电话号码需要在多个地方复用,或者后期可能动态调整,推荐用命名注册的方式把字符串参数先注册到容器,再关联到FaxService的构造参数:
class Program { static void Main(string[] args) { var container = new UnityContainer(); container.RegisterType<IFaxProvider, ConcreteFaxProvider>(); // 把电话号码以命名实例的形式注册到容器 container.RegisterInstance<string>("FaxServicePhone", "123-456-7890"); // 注册FaxService时,指定构造参数对应这个命名的字符串实例 container.RegisterType<FaxService>( new InjectionConstructor( new ResolvedParameter<string>("FaxServicePhone"), new ResolvedParameter<IFaxProvider>() ) ); var faxService = container.Resolve<FaxService>(); } }
这种方式的优势是字符串参数的管理更集中,后续要改号码或者换来源,只需要修改注册命名实例的那一行代码即可。
补充一句:Unity默认会尝试自动解析构造函数参数,但因为string是通用类型,Unity不知道该注入哪个具体的字符串,所以必须像上面这样显式指定参数来源,这两种方案都完全符合你“不修改FaxService构造函数”的要求。
内容的提问来源于stack exchange,提问作者John Livermore
相关产品推荐
相关产品推荐

