Unity2解决问题

时间:2011-06-02 07:19:19

标签: .net inversion-of-control unity-container ioc-container

人。 我们正在将MS Unity 2框架用于应用程序。

我们的代码类似于下面描述的

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>();
     ...
}

我们需要使用Unity描述Context和SomeFlow类之间的关系。构造的问题是在容器构造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 个答案:

答案 0 :(得分: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);           
}

答案 1 :(得分:1)

除了Mark的回答,您可以注册一个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;
}));