mef - 如何自动重组?

时间:2010-11-15 15:57:54

标签: c# plugins refresh mef

我一直试图重新组合工作,但没有运气......我尝试了很多次和许多方法 - 没有运气......任何人都可以指出我的错误?我希望在将新的.dll放入plugins目录后,Senders集合将自动重新填充新内容......

//exported classes
[Export(typeof(ISender))]
public class SMTP : ISender
{
    public string Name
    {
        get { return "SMTP plugin"; }
    }

    public void Send(string msg)
    {

    }
}

[Export(typeof(ISender))]
public class Exchange : ISender
{
    public string Name
    {
        get { return "Exchange plugin"; }
    }

    public void Send(string msg)
    {
        // .. blah
    }
}

/ ---------------------------------------------- -----------------------

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    private const string STR_Pugins = ".\\plugins";


    [ImportMany(typeof(ISender), AllowRecomposition = true)]
    private List<ISender> Senders;

    private DirectoryCatalog d;
    CompositionContainer c;

    public MainWindow()
    {
        InitializeComponent();
        listBox1.DisplayMemberPath = "Name";

        ConfigPlugins();
        bindSenders();
    }

    private void ConfigPlugins()
    {
        DirectoryInfo dir = new DirectoryInfo(STR_Pugins);

        if (!dir.Exists)
            dir.Create();

        d = new DirectoryCatalog(STR_Pugins);
        d.Changed += new EventHandler<ComposablePartCatalogChangeEventArgs>(d_Changed);
        c = new CompositionContainer(d);
        c.ExportsChanged += new EventHandler<ExportsChangeEventArgs>(c_ExportsChanged);

        c.ComposeParts(this);
    }

    void d_Changed(object sender, ComposablePartCatalogChangeEventArgs e)
    {
        bindSenders();
        MessageBox.Show("d_Changed " + (Senders == null ? 0 : Senders.Count));
    }

    private void bindSenders()
    {
        listBox1.ItemsSource = Senders;
    }

    void c_ExportsChanged(object sender, ExportsChangeEventArgs e)
    {
        bindSenders();
        MessageBox.Show("c_ExportsChanged "+ (Senders == null ? 0 : Senders.Count));
    }
}




<小时/> 回应后 好的,我已经添加了刷新,但我仍然不明白为什么列表框不会填充新数据......

public partial class MainWindow : Window
{
    private const string STR_Pugins = ".\\plugins";


    [ImportMany(typeof(ISender), AllowRecomposition = true)]
    private List<ISender> Senders;

    DirectoryCatalog d;
    CompositionContainer c;

    public MainWindow()
    {
        InitializeComponent();
        listBox1.DisplayMemberPath = "Name";

        ConfigPlugins();
        bindSenders();
    }

    private void ConfigPlugins()
    {
        DirectoryInfo dir = new DirectoryInfo(STR_Pugins);

        if (!dir.Exists)
            dir.Create();

        d = new DirectoryCatalog(STR_Pugins);
        c = new CompositionContainer(d);

        c.ComposeParts(this);
    }

    private void bindSenders()
    {
        label1.DataContext = Senders;
        listBox1.ItemsSource = Senders;
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        d.Refresh();
        bindSenders();
    }
}

2 个答案:

答案 0 :(得分:4)

您必须自己致电Refresh。如果需要,可以使用FileSystemWatcher对象在目录内容发生更改时收到通知。

答案 1 :(得分:1)

它不会重新填充,因为在更新字段时,会为该字段设置一个全新的列表。不修改现有集合。您必须将其设置为属性而不是字段(您仍然可以将其设置为受保护或私有),然后在调用“set”时,更新listBox1.ItemsSource和label1.DataContext。