2011-06-02 112 views
1

伙计。 我们正在为应用程序使用MS Unity 2框架。Unity2解决问题

我们有类似下面

public class Context:IContext 
{ 
    public IFlow Flow {get;set;} 
} 

public class SomeFlow:IFlow 
{ 
    public IContext Context {get;set;} 
} 
... 
//Some code for getting IContext object 
{ 
    ... 
    IContext context = container.Resolve<IContext>(); 
    ... 
} 

描述我们需要描述的类上下文和SomeFlow使用Unity之间的关系的代码。构造的问题是当容器正在构建Context对象时,它需要创建需要Context对象等的SomeFlow对象。 在我们的例子中,SomeFlow对象必须包含指向之前创建的Context对象的链接。所以算法必须是下一个:

1. Create Context object 
2. Create SomeFlow object 
3. Point Context.Flow to SomeFlow 
4. Point SomeFlow.Context to Context 

而问题是我们怎么能用统一来描述它呢?

回答

2

您可以使用构造函数注入来为Flow提供上下文,然后在构造函数中设置向后引用。这里有一个简单的例子:

public interface IContext { IFlow Flow { get; set; } } 
public interface IFlow { IContext Context { get; } } 

public class Context : IContext 
{ 
    public IFlow Flow { get; set; } 
} 

public class SomeFlow : IFlow 
{ 
    public SomeFlow(IContext context) 
    { 
     this.Context = context; 
     context.Flow = this; 
    } 
    public IContext Context { get; set; } 
} 

[Test] 
public void Example() 
{ 
    IUnityContainer container = new UnityContainer(); 
    container.RegisterType<IContext, Context>(); 
    container.RegisterType<IFlow, SomeFlow>(); 
    var flow = container.Resolve<IFlow>(); 
    Assert.IsInstanceOf<Context>(flow.Context); 
    Assert.IsInstanceOf<SomeFlow>(flow); 
    Assert.AreSame(flow, flow.Context.Flow);   
} 
+0

Thx,但它需要对体系结构进行一些更改。 – 2011-06-02 11:50:16

1

或者马克的回答,您可以注册一个InjectionFactory,做配线你。注册以下代理可防止您必须更改应用程序设计:

container.Register<IContext>(new InjectionFactory(c => 
{ 
    var context = container.Resolve<IContext>(); 
    var flow = container.Resolve<IFlow>(); 
    context.Flow = flow 
    flow.Context = context; 
    return context; 
})); 
+0

它看起来很方便。它可以在Xml配置文件中完成吗? – 2011-06-02 11:49:32

+0

我不这么认为。 – Steven 2011-06-02 13:03:29