首页 新闻 会员 周边

Unity2.0构造注入(xml配置)

0
悬赏园豆:30 [已解决问题] 解决于 2010-08-17 22:04

public interfacle IOrderRepository{}

public interfacle IMainModuleContext{}

public class OrderRepository:IOrderRepository

{

public OrderRepository(IMainModuleContext context) {

}

}

 

请问如何使用xml配置注入上面那个构造函数呢?

 

<register type="XXXXXX" mapTo="XXXXXXXX">
        <constructor>
          <param name="context">
            <value value="XXXXXXXXXX"/>
          </param>
        </constructor>
      </register>

 

上面OrderRepository类要修改一下,要实现构造注入给context.

 

public class OrderRepository:IOrderRepository {

private IMainModuleContext Context;

public OrderRepository(IMainModuleContext context) {

Context=context;

}

 public void Add()

{

Context.add();

}

 }

顺德人的主页 顺德人 | 初学一级 | 园豆:33
提问于:2010-08-16 10:25
< >
分享
最佳答案
0

如果要构造函数注入还需要新增一个类实现IMainModuleContext:

 

<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<alias alias="IOrderRepository" type="EntLib.IOrderRepository, EntLib" />
<alias alias="IMainModuleContext" type="EntLib.IMainModuleContext, EntLib" />
<alias alias="ModuleContext" type="EntLib.ModuleContext, EntLib" />
<alias alias="OrderRepository" type="EntLib.OrderRepository, EntLib" />
<namespace name="EntLib" />
<assembly name="EntLib" />
<container name="TestContainer">
<register type="IOrderRepository" mapTo="OrderRepository">
<constructor>
<param name="context" type="IMainModuleContext" dependencyType="ModuleContext">
</param>
</constructor>
</register>
</container>
</unity>

 

 

收获园豆:10
kyo-yo | 大侠五级 |园豆:5587 | 2010-08-16 12:35
其他回答(2)
1
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="enterpriseLibrary.UnityContainer"
type
="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
</configSections>

<enterpriseLibrary.UnityContainer>
<typeAliases>

<!-- Lifetime manager types -->
<typeAlias alias="singleton"
type
="Microsoft.Practices.Unity.ContainerControlledLifetimeManager,
Microsoft.Practices.Unity"
/>
</typeAliases>

<containers>
<container>
<types>
<type type="UnityConsoleApplication.IOrderRepository, UnityConsoleApplication"
mapTo
="UnityConsoleApplication.OrderRepository, UnityConsoleApplication"/>

<!--把 MainModuleContextFactory 配置成单例模式,
在整个Unity Container 中只会有一个 MainModuleContextFactory 对象。
-->
<type type="UnityConsoleApplication.IMainModuleContext, UnityConsoleApplication"
mapTo
="UnityConsoleApplication.MainModuleContextFactory, UnityConsoleApplication">
<lifetime type="singleton" />
</type>

</types>
</container>
</containers>
</enterpriseLibrary.UnityContainer>
</configuration>

 

 

相关类定义:

 

 

namespace UnityConsoleApplication
{
public interface IOrderRepository
{
public void Add();
}

public interface IMainModuleContext
{
public void Add();
}

public class OrderRepository : IOrderRepository
{
private IMainModuleContext innerContext;

public OrderRepository(IMainModuleContext context)
{
innerContext
= context;
}

public void Add()
{
this.innerContext.Add();
}
}

public class MainModuleContextFactory : IMainModuleContext
{
public void Add()
{
throw new NotImplementedException();
}
}
}

 

 

调用,我们假设配置在应用程序配置文件中,使用默认方式加载:

 

namespace UnityConsoleApplication
{
class Program
{
static void Main(string[] args)
{
IUnityContainer container
= new UnityContainer();
UnityConfigurationSection section
= (UnityConfigurationSection)ConfigurationManager.GetSection("enterpriseLibrary.UnityContainer");
section.Configure(container);

// 获取 IOrderRepository.
IOrderRepository order = container.Resolve<IOrderRepository>();

// 获取 IMainModuleContext,由于我们把它配置成了单例模式,
// 因此,你在程序中的任何地方使用此语句,都将返回相同的
// IMainModuleContext 实例;包括在上一步获取 IOrderRepository
// 时,如果已经创建过 IMainModuleContext,系统会用已经创建的
// 实例作为 public OrderRepository(IMainModuleContext context)
// 的构造函数参数传入,如果没有,则创建后传入。
IMainModuleContext context = container.Resolve<IMainModuleContext>();
}
}
}

 

 

收获园豆:20
Launcher | 园豆:45045 (高人七级) | 2010-08-16 11:11
如果你的IMainModuleContext是给多个类的 Repository 使用的,你可以把 IMainModuleContext 配置为 singleton
支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2010-08-16 11:14
这里需要构造注入阿.因为我那个context还有别的地方用到. public class OrderRepository:IOrderRepository { private IMainModuleContext Context; public OrderRepository(IMainModuleContext context) { Context=context; } public void Add() { Context.add(); } }
支持(0) 反对(0) 顺德人 | 园豆:33 (初学一级) | 2010-08-16 12:32
@顺德人:更新了我的解答,你可以理解下Unity的原理.
支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2010-08-16 13:14
非常感谢你,今天看了Unity的Hands On Labs还没有找到答案.
支持(0) 反对(0) 顺德人 | 园豆:33 (初学一级) | 2010-08-16 13:29
@顺德人:Unity可以自动识别构造函数中的可实例化参数,并调用该参数的地构造函数创建实例.同时,它会选择参数的多个构造函数版本中含参数最多的那个版本.
支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2010-08-16 13:42
1

 <type type="XXXXXX.IOrderRepository, XXXXXX"
                mapTo="XXXXXX.OrderRepository, XXXXXX"/>

jowo | 园豆:2834 (老鸟四级) | 2010-08-16 11:20
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册