1

我正在使用 MEF 的 WPF 应用程序。但即使我运行下面的代码(作为代码中某个位置的测试代码片段),目录也总是空的。所有示例代码都做了同样的事情,它们工作正常。但我的不工作。我错过了一些我自己无法弄清楚的重要事情。所以,我需要一些帮助。

var catalog = new AggregateCatalog();        
var x = Assembly.GetExecutingAssembly().Location;

catalog.Catalogs.Add(
new DirectoryCatalog(
          Path.GetDirectoryName(
          Assembly.GetExecutingAssembly().Location)));
CompositionContainer container = new CompositionContainer(catalog);

这是实际的场景代码。同一个解决方案中有 3 个项目。

  1. W PF 项目。
  2. 扩展项目。
  3. 合同项目。

扩展项目包含导出。而contract项目包含了W PF项目和Extension项目共享的接口。

[Export("LoginManager", typeof(IEmployeeLoginManager))]
public class LoginManager : IEmployeeLoginManager
{
    public EmployeeLoginModel LoginEmployee(String userName, string password) 
    {
        DEmployeeLoginManager employeeLoginManager = new DEmployeeLoginManager();
        return employeeLoginManager.LoginEmployee(userName, password);
    }
}

此导出在 WPF 项目中使用如下,

public partial class LoginWindow
{
    public EmployeeLoginModel LoggedInEmployee;
    [Import("LoginManager",AllowDefault = true)]
    private IEmployeeLoginManager LoginManager;

    public LoginWindow()
    {
        InitializeComponent();

    }

    private void RadWindow_Closed_1(object sender, Telerik.Windows.Controls.WindowClosedEventArgs e)
    {
        Application.Current.Shutdown();
        Environment.Exit(0);
        return;
    }

    private void RadButton_Click_1(object sender, RoutedEventArgs e)
    {
        string passWord = PasswordText.Password;
        LoggedInEmployee.Password = passWord;

        var container = MEFLoader.GetMEFContainer();
        container.ComposeParts(this);
        EmployeeLoginModel employee= LoginManager.LoginEmployee(LoggedInEmployee.UserName, passWord);

        if (employee.LoginStatus == true) 
        {
            this.Close();
        }

    }

PS:这是 MEFLoader 类:

public static class MEFLoader
{
    public static CompositionContainer GetMEFContainer() 
    {
        var catalog = new AggregateCatalog(new DirectoryCatalog("."), new AssemblyCatalog(Assembly.GetExecutingAssembly()));
        var container = new CompositionContainer(catalog);
        return container as CompositionContainer;
    }
}

我是 MEF 的新手,我也很欣赏我的代码中的任何改进点。

提前致谢。

4

1 回答 1

0

首先,我认为其他项目中位于相同解决方案中的部分由下面显示的代码片段自动识别。

 var catalog = new AggregateCatalog();         
catalog.Catalogs.Add(
new DirectoryCatalog(
          Path.GetDirectoryName(
          Assembly.GetExecutingAssembly().Location)));
CompositionContainer container = new CompositionContainer(catalog);

但事实并非如此,我们必须手动将 dll 放入正在执行的项目 bin/debug 中(因为这是在调试模式下运行的)

或者你需要做的是,你必须将项目属性 => 构建事件 => 构建事件命令行更改为

copy $(TargetPath) $(SolutionDir)\[Your running application folder]\bin\Debug

这将自动将必要的 dll 复制到正在执行的 bin。

或者您可以在项目属性=>构建=>输出路径中更改它,您可以将输出路径设置为执行项目的Debug文件夹。

于 2013-01-06T09:00:43.683 回答