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();
}
}
如果要构造函数注入还需要新增一个类实现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>
<?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>();
}
}
}
<type type="XXXXXX.IOrderRepository, XXXXXX"
mapTo="XXXXXX.OrderRepository, XXXXXX"/>