人。 我们正在将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
问题是我们怎么能用统一来形容呢?
答案 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;
}));