Ich plane die Verwendung von MEF, um eine Plugin-Architektur für meine Import-Plugins zu implementieren. Diese Plugins werden verschiedene Daten in die Datenbank importieren (zB Kunden, Adressen, Produkte, etc.).Verwenden von MEF mit DI in einer WebApi-Anwendung
Der Import Plugin-Klasse sieht wie folgt aus:
public interface IImportPlugin
{
string Name { get; }
void Import();
}
[Export(typeof(IImportPlugin))]
public class ImportCustomers : IImportPlugin
{
private readonly ICustomerService customerService;
public string Name
{
get { this.GetType().Name; }
}
public ImportCustomers(ICustomerService _customerService)
{
customerService = _customerService;
}
public void Import() {}
}
ich dann einen Controller haben, der zuerst alle Import Plugins wird wie folgt dar:
public IHttpActionResult GetImportPlugins()
{
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new DirectoryCatalog(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin")));
var directoryCatalog = new DirectoryCatalog(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins"));
catalog.Catalogs.Add(directoryCatalog);
var container = new CompositionContainer(catalog);
container.ComposeParts();
var list = container.GetExportedValues<IImportPlugin>().Select(x => x.Name);
return Ok(list);
}
Der Import-Plugin benötigt meine Services
Assembly verweisen weil hier die BL stattfindet. Ich melde mich meine Dienste im Haupt WebAPI Projekt mit Autofac wie folgt:
builder.RegisterAssemblyTypes(assemblies)
.Where(t => t.Name.EndsWith("Service"))
.AsImplementedInterfaces()
.InstancePerRequest();
Ist es möglich, verschiedene Dienste zu verschiedenen Import-Plugins übergeben?
Zum Beispiel, wenn ich Produkte importieren bin ich brauche die ProductService
zu passieren, und wenn ich Kunden bin importieren könnte ich CustomerService
und AddressService
übergeben müssen.
Wie kann ich diese Dienste innerhalb der Plugins (über ihre Konstruktoren, genau wie in einem Controller) injizieren?
Können Sie keine Module in Ihren Plugins registrieren? Zum Beispiel können Sie in Ninject NinjectModule angeben, in dem Sie Ihre Plugin-Dependencies registrieren. Dann registrieren Sie in Ihren Hauptmodulen einfach alle Module im Plugin-Ordner, und alle Ihre BL-Schnittstellen-Implementierungen werden in Plugins verfügbar sein. – eocron