/ / WPF com módulos de carregamento de unidade baseados em interface - wpf, unidade-recipiente, prisma

WPF com módulos de carregamento de unidade baseados em interface - wpf, unidade-recipiente, prisma

Eu estou escrevendo um aplicativo WPF usando Prism / Unity.

Eu tenho meu aplicativo principal (com um bootstrapper).

Eu tenho interfaces para cada um dos meus módulos. Por exemplo:

MyModuleA implementa IMyModuleA

MyModuleB implementa IMyModuleB

Eu quero implementar acoplamento flexível e injeção de dependência.

Então, no meu bootstrapper, eu quero especificar que eu estou carregando uma biblioteca (tipo) com base em uma interface.Isso me permitiria construir o módulo de forma independente.

No meu bootstrapper, tenho o seguinte:

protected override void ConfigureModuleCatalog() {
base.ConfigureModuleCatalog();

string path = @"Modules.MyModuleA.dll";
var assembly = Assembly.LoadFrom(path);
var type = assembly.GetType("Modules.MyModuleA.MyModuleA");
ModuleCatalog.AddModule(new ModuleInfo {
ModuleName = type.Name,
ModuleType = type.AssemblyQualifiedName,
Ref = new Uri(path, UriKind.RelativeOrAbsolute).ToString()
});
}

Esse é o melhor jeito de fazer isso?

Respostas:

0 para resposta № 1

Devo dizer que esta não é a melhor maneira de fazer issoporque você ainda está especificando o tipo por string, o que é ainda pior, porque deixa espaço para erro humano. Injeção de dependência e acoplamento solto é sobre o uso da interface e o registro de diferentes tipos que implementam essa interface em tempo real.

Se você quiser carregar diferentes módulos rapidamente para a mesma interface, você deve usar seu próprio Bootstraper, que é chamado no caminho do código desejado. E dentro dela use:

if(shouldUseEmail)
Container.RegisterType<IFeedbackService, EmailFeedbackService>();
else
Container.RegisterType<IFeedbackService, SMSFeedbackService>();

E depois você resolve assim:

var feedbackService = Container.Resolve<IFeddbackService>();

Ou use DI (injeção de dependência em construtores)