0

MEFを使用してプラグインフレームワークを実装しようとしていますが、インターフェイスがあります

public interface IPlugin
{
   string SomeProperty {get;set;}
   IList<string> DoSomething(string somevalue);
}

多くをインポートする実装を行うことを考えていました

public class MainContainer : IPlugin
{
    public string _name;

    public MainContianer(){

    }
    public MainContainer(string name){
       _name = name;
    }

    [ImportMany]
    List<Lazy<IPlugin, string>> plugins;

    string SomeProperty { get { 
       var plugin  = plugins.Where(a => a.Metadata.Equals(_name)).FirstOrDefault();
            if (plugin  != null) {
                return plugin.Value.SomeProperty;
            }
            throw new CustomException();
    } }

    List<string> DoSomething(string value){
        var plugin  = plugins.Where(a => a.Metadata.Equals(_name)).FirstOrDefault();
            if (plugin  != null) {
                return plugin.Value.DoSomething(value);
            }
            throw new CustomException();
    }
}

私の質問は、プロパティとメソッドごとに同じブロックを作成するよりも、これを実装するためのより良い方法があるかどうかです。

var plugin  = plugins.Where(a => a.Metadata.Equals(_name)).FirstOrDefault();
if (plugin  != null) {
   return plugin.Value.xxx
}
4

1 に答える 1

0

私はまったく間違って見ていました。コードを更新しました。電卓の例で間違った方向に進みました。

public class MainContainer
{
    private CompositionContainer _container;

    [ImportMany]
    public IEnumerable<IPlugin> Plugins;

    public AdapterProvider(string pluginpath)
    {
        var catalog = new AggregateCatalog();
        catalog.Catalogs.Add(new DirectoryCatalog(pluginpath));
        _container = new CompositionContainer(catalog);
        _container.ComposeParts(this);
    }
}

十分です、

モデレーターは、これを無効な質問として閉じることができます。

于 2013-01-23T06:43:24.253 に答える