Simple Plugin with MEF .How Can I load plugin using a config File
I am writing a small plugin architecture and I have decided to use MEF I have been told that we must use a config file.
Is there any example out there that that uses Mef and a config file?
All I need is how to set up mef in a config file is this possible? This is a small noddy example I have built to test it I am missing the loadPlugin function and config file Can you help
Noddy example
//MyCo开发者_如何学Cmpany.Payment.Contracts.dll
public interface IPayment
{
bool Pay();
}
//MyCompany.Payment.ServiceProviderOne.dll
[Export(typeof(IPayment))]
public class ServiceProviderOne:IPayment
{
public bool Pay(return true);
}
//MyCompany.Payment.ServiceProviderTwo.dll
[Export(typeof(IPayment))]
public class ServiceProviderTwo:IPayment
{
?public bool Pay(return true);
}
//Main Console.Applicaiton
class Program
{
static void Main(string[] args)
{
HelperPlugin helperPlugin =new HelperPlugin();
List<IPayment> myLoadedPayments= helperPlugin.GetPlugins();
//blahhh conti
}
}
public cass HelperPlugin
{
[ImportMany(typeof(IPayment))]
public List<IPayment>Payments { get; set; }
public List<IPayment>GetPlugins()
{
Payments=new List<IPayment>();
LoadPlugins();
return Payments;
}
private void LoadPlugins()
{
???
}
}
Config File What does it look like?
Thanks for any suggestions or code snippets
I'm working on a similar issue right now and my approach is this:
- I'm planning to have a config file that defines how my
CompositionContainer
will be configured - My config should contain a list of directories for the container to scan (by using a
DirectoryCatalog
for each directory specified) - and my config should also support a list of assemblies that might be stored elsewhere, and that would be included by having several
AssemblyCatalog
used for that purpose
So basically, I'm trying to configure the individual catalogs that make up my AggregateCatalog
which the composition container will use to find the parts. Not there yet, unfortunately - so this is just in my head for now - no code just yet.
What I did in a recent project was to include a Name property in the interface. All the extensions I wanted to be accessible got loaded, then a config file setting listed the ones by Name that I wanted to use. I used a loop to inspect the extensions that were loaded and, if they were named in the setting, I added them to an internal list.
My requirement was to have a specific order that extensions were used, so this solution worked for me.
I could have included metadata in the assemblies to accomplish the same thing, but wanted the information more visible and part of the contract.
精彩评论