Unity中使用多构造函数(转)

本文介绍了如何使用Unity容器根据不同的构造函数实例化类,并通过配置文件指定实例化方式。包括解决多个构造函数时的冲突问题,以及如何使用[InjectionConstructor]特性和ParameterOverrides来指定特定构造函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果要实例化的类只有一个构造函数, 则使用方法很简单使用方法如下:

1
2
3
4
5
6
7
using (IUnityContainer container = new  UnityContainer())
{
     UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection( "unity" );
     section.Configure(container);     //...
     ILogger logger = container.Resolve<ILogger>( "DatabaseLogger" );
     return  logger;
}

其中配置文件为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version= "1.0"  encoding= "utf-8"  ?>
<configuration>
   <configSections>
     <section name= "unity"  type= "Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration" />
   </configSections>
   <unity>
     <containers>
       <container>
         <types>
           <type type= "Bery.ILogger, UnityStudy"  mapTo= "Bery.DatabaseLogger, UnityStudy"  name= "DatabaseLogger" >
           </type>
         </types>
       </container>
     </containers>
   </unity>
</configuration>

如果DatabaseLogger类中的有两个构造函数, 代码如下

1
2
3
4
5
6
public DatabaseLogger()
}
public DatabaseLogger(string name)
{
}

则Unity自动使用参数最多的构造函数进行创建对象, 会抛出以下异常:

1
2
3
Microsoft.Practices.Unity.ResolutionFailedException: Resolution of the dependency failed, type = "Bery.ILogger" , name = "DatabaseLogger" .
Exception occurred while : while  resolving.
Exception is: InvalidOperationException - The type String cannot be constructed. You must configure the container to supply this  value.

如果您想让它使用无参的构造函数创建, 则要使用[InjectionConstructor]特性进行修饰无参的构造函数,

1
2
3
4
[InjectionConstructor]
public DatabaseLogger()
}

若您想使用带参数的构造函数创建对象, 除了在构造函数上使用[InjectionConstructor]外, 还要在创建时传递参数,代码如下

1
2
3
4
5
6
7
8
9
10
using (IUnityContainer container = new  UnityContainer())
{
     UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection( "unity" );
     section.Configure(container);
     ILogger logger = container.Resolve<ILogger>( "DatabaseLogger" ,
         new  ParameterOverrides{
         { "name" , "logName" }
     });
     return  logger;

 

引用地址:http://unity3d.9tech.cn/news/2014/0208/39766.html

转载于:https://www.cnblogs.com/chinadeveloper/p/6184307.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值