MEF为提供程序System.Data.Client注册EntityFramework.SqlServer

时间:2015-05-25 16:39:08

标签: entity-framework-6 mef autofac sqlclient

我们有一个拥有大量依赖关系的多层应用。我们使用Autofac和MEF,以便所有组件都可以在init模块中注册自己的依赖项。这样,"更高"组件不必知道所有依赖关系图。它只是注册它需要的组件,其余的都来了。在更高级别,有一个WCF外观应用程序,它导入几乎所有的DLL并使用Autofac注册它们。它工作正常,但由于存储库层依赖于EntityFramework,我得到了臭名昭着的错误:

  

找不到ADO.NET提供程序的实体框架提供程序   不变名称' System.Data.SqlClient'。确保提供商是   在' entityFramework'中注册应用程序配置的一部分   文件

我发现没有此错误的唯一方法是直接引用WCF外观项目中的EntityFramework.SqlServer。但我想将此责任留给repo层本身。所以我需要一种方法以某种方式加载DLL并注册System.Data.SqlClient。有没有人知道这样做的方法还是我只是在做梦?这是我第一次使用Autofac和MEF,而且我远非DI的专家。

由于它是高概念性的,这里有一个带有源代码的小模式,可以帮助您更好地理解: Conceptual map

获取可转换版本here

1 个答案:

答案 0 :(得分:1)

也许你可以看看Code-Based Configuration

  1. 创建自定义DbConfiguration

    public class MyDbConfiguration : DbConfiguration 
    { 
        public MyDbConfiguration() 
        { 
            // Other configuration stuff like SetDefaultConnectionFactory
            SetProviderServices(
                "System.Data.SqlClient", 
                System.Data.Entity.SqlServer.SqlProviderServices.Instance);
        } 
    } 
    
  2. DbConfigurationTypeAttribute

    中添加DbContext
    [DbConfigurationType(typeof(MyDbConfiguration))] 
    public class MyDbContext : DbContext 
    { }
    

    [DbConfigurationType("MyNamespace.MyDbConfiguration, MyAssembly")] 
    public class MyDbContext : DbContext 
    { }
    
  3. 从app.config文件中删除entityFramework配置

  4. 修改

    对于您的顶级项目来查找MEF组件引用的程序集,如果您能够/愿意向app.config添加内容,也许您可​​以使用以下内容:

    <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <probing privatePath="Libs"/>
      </assemblyBinding>
    </runtime>
    

    从某种意义上说,它仍然是一种依赖,但你必须为MEF添加一个搜索路径......

    https://msdn.microsoft.com/en-us/library/823z9h8w%28v=vs.110%29.aspx
    How can MEF resolve dependencies of assemblies that don't live at the root of the application?