Je prévois d'utiliser MEF pour implémenter une architecture de plugin pour mes plugins d'import. Ces plugins vont importer diverses données dans la base de données (par exemple, les clients, les adresses, les produits, etc.).Utilisation de MEF avec DI dans une application WebApi
La classe plugin d'import ressemble à ceci:
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() {}
}
J'ai alors un contrôleur, qui obtient d'abord tous les plug-ins d'importation comme suit:
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);
}
Le module d'importation doit faire référence à mon assemblée Services
parce que c'est là que le BL a lieu. J'inscrire mes services dans le principal projet WebAPI avec Autofac comme suit:
builder.RegisterAssemblyTypes(assemblies)
.Where(t => t.Name.EndsWith("Service"))
.AsImplementedInterfaces()
.InstancePerRequest();
Est-il possible de passer différents services à différents plug-ins d'importation?
Par exemple, si je l'importation de produits J'ai besoin de passer le ProductService
, et si je clients l'importation je pourrais avoir besoin de passer CustomerService
et AddressService
.
Comment puis-je injecter ces services à l'intérieur des plugins (à travers leurs constructeurs comme on le ferait dans un contrôleur)?
Vous ne pouvez pas enregistrer des modules dans vos plugins? Par exemple, dans ninject vous pouvez spécifier NinjectModule dans lequel vous enregistrez vos dépendances de plugin. Ensuite, dans vos modules principaux, vous inscrivez simplement tous les modules dans le dossier plugin, et toutes les implémentations de vos interfaces BL seront disponibles dans les plugins. – eocron