Unity DI Inject в MarkupExtension - PullRequest
       19

Unity DI Inject в MarkupExtension

0 голосов
/ 22 октября 2018

Мне нужен PRISM EventAggregator в MarkupExtension.

Поскольку InjectionConstructor ничего не помогает, я пытался использовать InjectionProperty.Однако EventAggregator также никогда не создается.

Думаю, я выяснил причину.Класс, производный от MarkupExtension, никогда не разрешается из контейнера.Следовательно, никаких инъекций не происходит.

Я подтвердил этот вывод, используя следующий пример

public interface ITestClass
{
    IEventAggregator EventAggregator { get; set; }

    void DoSomething();
}


public class TestClass : ITestClass
{

    [Dependency]
    public IEventAggregator EventAggregator { get; set; }


    public TestClass()
    {

    }


    public void DoSomething()
    {   
        DoSomethingElse();
    }


    private void DoSomethingElse()
    {
        var secondInstance = new TestClass();
        Debugger.Break();
    }

}

Регистрация в UnityContainer выглядит следующим образом

InjectionMember[] injectionMembers = new InjectionMember[]
{
    new InjectionProperty( "EventAggregator",  typeof(IEventAggregator) )
};

_container.RegisterType<ITestClass , TestClass>( new TransientLifetimeManager() , injectionMembers );

Для целей тестирования Iразрешите TestClass непосредственно из контейнера и вызовите DoSomething ()

var cls = _container.Resolve<ITestClass>();
cls.DoSomething();

Более тщательное рассмотрение подтверждает мое предположение. cls.EventAggregator содержит используемый объект, secondInstance.EventAggregator имеет значение null.

То же самое происходит при попытке вставить EventAggregator в MarkupExtension.XAML создает экземпляр MarkupExtension напрямую и никогда не использует UnityContainer для его разрешения.

Есть ли способ использовать EventAggregator в MarkupExtension?

...