Pergunta

Eu estou tentando envolver minha cabeça em torno da melhor maneira de usar IoC dentro do meu pedido de injeção de dependência, no entanto eu tenho um pequeno problema.

Eu estou usando uma implementação frouxa do padrão MVP com um aplicativo WPF. Essencialmente, uma classe apresentador é instanciado, e uma vista e tarefa (por exemplo IEmployeeView e IEmployeeTask para EmployeePresenter) são injectados no apresentador.

Eu gostaria de usar um contêiner IoC (Eu estou tentando sair Unidade, embora eu acho que isso também acontece com outros, tais como ninject ou Estrutura Mapa) em vez de injetar manualmente esses casos, no entanto, se o apresentador é criado (ou resolvido a partir de um recipiente COI) em uma chamada assíncrona delegado, ou um segmento de eventos (por exemplo, não STA roscado), em seguida, a criação de uma nova instância de uma janela WPF lança a seguinte excepção:

A operação de compilação atual (chave de construção Desenvolver Key [ namespace .Window1, null]) falhou: O segmento de chamada deve ser STA, porque muitos componentes de interface do usuário exigem isso.

Agora, eu sei que as novas instâncias etc necessidade janela a ser STA, no entanto, é possível usar um contêiner IoC para fazer a injeção de dependência, mesmo quando a interface do usuário deve ser criado em um segmento STA?

De olhar para este problema parece que a classe / tipo a ser resolvido é instanciado no momento determinação, não quando a sua sede ...

Foi útil?

Solução

Eu diria para usar uma fábrica para criar os objetos do apresentador; Dessa forma, você pode criar suas instâncias genéricas de apresentadores de dentro do seu PresenterFactory em um segmento STA, e depois simplesmente passá-los para fora quando necessário.

Outras dicas

Seu problema não tem nada a ver com IoC, um objeto WPF só pode ser acessado a partir do mesmo thread que o criou - então você tem que criar o seu apresentador no mesmo segmento como o resto de sua GUI (e não apenas qualquer STA thread).

Use Dispatcher.BeginInvoke para executar código no thread principal e chamar Ioc contianer de lá.

Você menciona Unidade, você olhou para usar a biblioteca de aplicativos compostos, que também usa-lo? A aplicação de exemplo StockTrader usa Unity para injetar vista para modelos de apresentação .. Se você não quer realmente usar a CAL - mais informações: ( http://msdn.microsoft.com/en-us/library/cc707890 .aspx ou http://www.codeplex.com/CompositeWPF )

Você ainda pode ser capaz de trabalhar para fora como eles chegaram em torno da questão ..

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top