- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
背景:
我们有一个包含许多模块的项目。我们正在使用带有FluentAPI(CodeFirst)的EntityFramework 4.2。
有一个名为Diverto.ORM.EntityFramework.SQLServer的中央项目,该项目包含使用FluentAPI构建上下文的部分类(并具有对解决方案上所有其他项目的引用)。
最近,我们收到了客户的要求,以实现许多其他功能,而该解决方案将需要其他几个项目。其中一些项目将来自另一个系统(人力资源),并且将创建一些项目。现有解决方案的核心是财务系统。
我们想使用MEF即时启用和禁用这些新项目(以及GUI,业务逻辑和所有)。它们将作为插件进行交互,并且也将使用MEF填充应用程序的主菜单。
但是,由于它们必须共享数据,我们对于如何启用/禁用这些模块/项目(新模块和HR模块)并没有真正的线索。
考虑一下:
-具有DbSet
-具有DbSet
现在,考虑到在GUI中,我必须有权访问ClassA,ClassB和ClassC中的数据(如果有插件)。
找到解决方案!见波纹管
嘿,您在这里,请在回答之前阅读本说明!
我注意到有些人将其签出并将其标记为收藏或赞誉。请记住,这个答案可以追溯到2012年,从那以后EntityFramework发生了很大变化。
另外,请记住,每个项目都有其自己的需求。那时,我需要这种功能。您的项目可能根本不需要此功能,或者仅需要其中一部分!
最后,只是为了确保所有内容都被掩盖,是的,可以使用EF 6.1和EF迁移进行此工作,并且使用其他ORM和迁移框架也可以进行此工作。
您可能需要其他一些接口,以作为要加载的迁移的接口,并正确处理特定的插件迁移(不要将其与其他插件混合使用,因此请尝试为每个插件实现某种唯一的令牌)。
最佳答案
找到解决方案!
好吧,我将在这里尝试解释,因为在其他地方找不到。对于那些必须创建一个将接收多个插件的基本软件的人们来说,这很有趣,这些插件必须与单个数据库中的现有数据进行交互。
首先,我将使用带有CodeFirst API等的Entity Framework。因此,如果您要研究此内容,我建议您阅读MSDN中的EntityTypeConfiguration和MSDN中的Code First Fluent API。
现在,让我们强调一些事情:
您必须只有一个上下文,一切才能正常工作。我将深入探讨该问题,并展示一种在应用程序的上下文中具有来自插件的类的方法,但是要使其正常工作,您必须了解通用存储库模式。我在这里只显示一点,但建议您继续研究,并尝试为您的应用创建最佳界面。
MEF将在这里成为我们的朋友。我认为您已经知道如何使用MEF创建简单的插件以及如何访问该插件中的方法。另外,我将尽量避免深入研究MEF,因为这里不是这种情况,因为您可以使用其他解决方案。实际上,我之所以使用MEF,只是因为我已经对它有所了解。
如果您要进入“哦,我需要处理多个上下文创建,这些上下文将指向一个数据库以及所有数据库”,那么您做错了。这一切都与简单的配置和一些流畅的API有关。相信我:我已经在互联网上搜索了一个星期,最后与一位朋友交谈后,我们找到了这种解决方案,这真的很简单=)。
第一件事
解决方案:MEFTest
项目:
Base.ORM(将保存ORM的接口)
Base.ORM.EntityFramework.SQLServer(将保存EF的基类)
SampleApplication.ORM.EntityFramework.SQLServer(将保存应用程序的上下文)
SampleApplication(可执行)
MEFPlugin(将容纳我们的插件)
现在,编码
在Base.ORM项目中,使用您认为合适的方法创建通用存储库接口,但未键入该接口。它将类似于:
public interface IRepository
{
bool Add<T>(T item);
}
public class BaseContext : IRepository
{
public bool Add<T>(T item)
{
try { Set<T>().Add(item); return true; }
catch { return false; }
}
}
public class Context : BaseContext
{
public DbSet<ClassA> ClassA { get; set; }
public DbSet<ClassB> ClassB { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
/* I'll talk about this later. Just override the OnModelCreating and leave it */
base.OnModelCreating(modelBuilder);
}
}
public void Setup(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<ClassC>().ToTable("ClassC");
modelBuilder.Entity<ClassC>().HasKey(_classC => _classC.Id);
modelBuilder.Entity<ClassC>().Property(_classC => _classC.Date2).HasColumnType("datetime2").HasPrecision(7);
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<ClassA>().ToTable("ClassA");
modelBuilder.Entity<ClassA>().HasKey(_classA => _classA.Id);
modelBuilder.Entity<ClassB>().ToTable("ClassB");
modelBuilder.Entity<ClassB>().HasKey(_classB => _classB.Id);
modelBuilder.Entity<ClassB>().Property(_classB => _classB.TestDate).HasColumnType("datetime2").HasPrecision(7);
/* Use MEF to load all plugins. I'll use the mock interface IPlugin */
foreach (IPlugin plugin in MefLoadedPlugins)
plugin.Setup(modelBuilder);
}
public class ClassA
{
public int Id { get; set; }
public string Name { get; set; }
}
public class ClassB
{
public int Id { get; set; }
public string OtherName { get; set; }
}
public interface IRepository
{
bool Add<T>(T item);
bool Save();
}
public class BaseContext : DbContext, IRepository
{
public bool Add<T>(T item)
{
try { Set<T>().Add(item); return true; } catch { return false; }
}
public bool Save()
{
try { SaveChanges(); return true; } catch { return false; }
}
}
public class Context : BaseContext
{
// Fill this list using MEF - check for the IPluginContext interface on assemblies
public List<IPluginContext> MefLoadedPlugins;
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<ClassA>().ToTable("TableB", "Schema_1");
modelBuilder.Entity<ClassA>().HasKey(_a => _a.Id);
modelBuilder.Entity<ClassB>().ToTable("TableB", "Schema_1");
modelBuilder.Entity<ClassB>().HasKey(_b => _b.Id);
if (MefLoadedPlugins != null)
foreach (var pluginContext in MefLoadedPlugins)
pluginContext.Setup(modelBuilder);
}
}
public class ClassC
{
public int Id { get; set; }
public string Description { get; set; }
}
public interface IPluginContext
{
void Setup(DbModelBuilder modelBuilder);
}
public class Just_A_Sample_Plugin_Context : IPluginContext
{
public void Setup(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<ClassC>().ToTable("TableC", "Schema_2");
modelBuilder.Entity<ClassC>().HasKey(_c => _c.Id);
}
}
public void DoSomething(IRepository repo)
{
var classA = new ClassA() { Name = "First Name" };
repo.Add(classA);
repo.Save();
}
关于entity-framework - 首先使用MEF插件和EF代码-怎么做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8730830/
我在互联网上搜索了很多小时,但没有找到满意的结果,所以 -VSTO Addin 和 COM Addin(我们作为类库项目制作并使用 Excel 对象)之间有什么区别?VSTO 项目是否有任何限制,例如
我在互联网上搜索了很多小时,但没有找到满意的结果,所以 -VSTO Addin 和 COM Addin(我们作为类库项目制作并使用 Excel 对象)之间有什么区别?VSTO 项目是否有任何限制,例如
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我正在寻找有关如何构建可扩展 WCF 服务器(具有动态加载的服务)的建议,最好使用 System.Addins 或 MEF。 服务器应托管实现最小“插件”API(StartService/StopSe
有没有一种方法可以使用加载浏览器扩展/插件/插件的 headless 浏览器(即 PhantomJS、Selenium)来运行自动测试? 更具体地说,我想模拟广告拦截器(如 Ghostery、ad-b
我是 gradle 的新手,我使用 artifactory 作为我的 repo 服务器。我在网上查看了如何将我的项目发布到我的 repo 服务器,发现我可以使用 maven-publish 或使用 a
我想禁用某些状态的点击/事件,并仅使少数状态可点击。我通读了http://newsignature.github.io/us-map/处的文档,并且找不到与此问题相关的任何内容。 最佳答案 http:
据我了解,在Intellij中使用idea插件打开Maven构建的项目并不是最好的方法,即调用: mvn idea:idea 但是直接打开pom文件(Intellij有默认的Maven插件);同样的事
使用Artifactory plugin对于 Jenkins pipeline 来说是一种幸福,只要遵循文档就可以了。但后来我介绍了Maven Flatten plugin解析父模块和子模块 mvn
我已经安装了Elasticsearch版本1.7.1。一切正常。我也安装了 JDBC 驱动程序。检查下面我的插件文件夹 目录E:\Xampp\htdocs\my-elastic\elasticsear
在我使用 webpack common chunks 插件创建包含第三方库(如 angular、react、lodash 等)的 vendor 包之前,但后来我知道了 webpack dll
我们正在尝试使用(Jenkins、sonar、eclipse ...)安装 CI 平台。 为了让每个开发人员都可以在提交之前对他的代码进行分析,我想知道两种选择: 使用 Sonar 插件运行本地分析。
我知道这是一个比较特殊的问题。尽管如此,也许有些人知道这一点: 我想在 Eclipse 中使用 Maven 编译 Hector=> 分支:0.7.0 和标签:hector-0.7.0-29(https
我卡住了。我一直在尝试寻找或自己创建一个简单的准系统示例,说明如何为 VS 2010 Express 创建 Outlook 插件。我知道这在 VS 2010 Pro 中更简单,但是,在快速版本中真的不
我有以下排除过滤器来忽略所有 R 文件类: findbugs-exclude-filter.xml 当我将它用于 FindBugs-IDEA 插件时,它可以
我刚开始玩 CakePHP,我发现了 Wildflower CMS .我喜欢这个想法,并打算开始修补它。不过,我有一个问题。 在自述文件中,我发现了以下内容:“Wildflower 不是也不会是 Ca
虽然现在大部分情况都是使用n-api来编写插件,但是底层毕竟是v8(和libuv),使用v8编写简单的插件,同时熟悉v8的使用。 本文介绍在写c++插件时,简单又常用的写法,其实本质上,写插件
本篇是 Python 系列教程第 3 篇,更多内容敬请访问我的 Python 合集 Visual Studio Code的安装非常简单,就不放这里增加文章篇幅了。 相比PyCharm,V
Maven – 插件 什么是 Maven 插件? Maven 实际上是一个依赖插件执行的框架,每个任务实际上是由插件完成。Maven 插件通常被用来: 创建 jar 文件 创建 war
我正在编写一个插件来添加带有标签 [deposit_page] 的页面;该标记应替换为一些 PHP 代码。 这就是我所拥有的,但它不起作用。有什么我遗漏或做错了什么吗? function deposi
我是一名优秀的程序员,十分优秀!