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つのプロジェクトがあります。
- WPFプロジェクト。
- 拡張プロジェクト。
- 契約プロジェクト。
拡張プロジェクトにはエクスポートが含まれています。コントラクトプロジェクトには、WPFプロジェクトと拡張プロジェクトで共有されるインターフェイスが含まれています。
[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を初めて使用し、コードの改善点にも感謝しています。
前もって感謝します。