MEF并在运行时加载EntityTypeConfiguration

时间:2011-10-05 08:13:59

标签: winforms entity-framework mef

您不能在自己的帖子上投票 0

您好。

我正在开发这个(http://arg-co.com/SabteNam%20-%20Copy.zip)windows应用程序,对于我的DAL,我使用Entity Framework。但是每个扩展都有自己的EntityTypeConfiguration,所以我决定使用[Import]和[Export]将它们添加到我的DbContext的OnModelCreating方法中。这里的问题是,在'Sa​​bteNamDbContext'类中,它位于'SabteNamDataAccess'库中,'_Configs'没有初始化,所以我不能迭代它并将其项添加到'modelBuilder.Configurations'。

在'SampleConfiguration'类的源代码中,我注释掉'[Export(typeof(IDbConfiguration))]',但即使取消注释这部分代码,也不会导致应用程序正常工作。

有趣的是,如果我在'Main'窗体中使用以下代码,'_Configs'将被初始化:

[ImportMany(typeof(IDbConfiguration))]
public IEnumerable<EntityTypeConfiguration<object>> _Configs { get; set; }

如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

虽然我意识到这可能对您不再有用,但我们在this model from OdeToCode上使用了一个变体,我建议您阅读。

在我们的例子中,我们为扩展创建了一个接口,不仅仅是像Scott那样的实体配置,它不仅允许我们加载配置,还允许每个扩展加载工厂和测试数据,添加新的权限核心应用程序的类型等。

我们的OnModelCreating看起来像这样:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // load core object mappings
    modelBuilder.Configurations.Add(new UserConfiguration());
    modelBuilder.Configurations.Add(new PermissionConfiguration());

    // get plugin assemblies
    var catalog = new DirectoryCatalog("bin");
    var container = new CompositionContainer(catalog);
    container.ComposeParts();
    var plugins = container.GetExportedValues<IPlugin>();

    // load plugin object mappings
    foreach (IPlugin plugin in plugins)
    {
        plugin.RegisterDomainEntities(modelBuilder.Configurations);
    }

    base.OnModelCreating(modelBuilder);
}