Unity2 решить проблему - PullRequest
1 голос
/ 02 июня 2011

ребята. Мы используем MS Unity 2 Framework для приложения.

У нас есть код, аналогичный описанному ниже

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

Нам нужно описать отношения между классами Context и SomeFlow с использованием Unity. И проблема с конструированием заключается в том, что когда контейнер создает объект Context, ему нужно создать объект SomeFlow, для которого требуется объект Context и так далее. В нашем случае объект SomeFlow должен содержать ссылку на созданный ранее объект Context. Поэтому алгоритм должен быть следующим:

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

И вопрос в том, как мы можем описать это единством?

Ответы [ 2 ]

2 голосов
/ 02 июня 2011

Вы можете сделать это с помощью инжектора конструктора, чтобы дать 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 голос
/ 02 июня 2011

В качестве альтернативы ответу Марка вы можете зарегистрировать 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;
}));
...