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 № 1Devo 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)