我们有一个拥有大量依赖关系的多层应用。我们使用Autofac和MEF,以便所有组件都可以在init模块中注册自己的依赖项。这样,"更高"组件不必知道所有依赖关系图。它只是注册它需要的组件,其余的都来了。在更高级别,有一个WCF外观应用程序,它导入几乎所有的DLL并使用Autofac注册它们。它工作正常,但由于存储库层依赖于EntityFramework,我得到了臭名昭着的错误:
找不到ADO.NET提供程序的实体框架提供程序 不变名称' System.Data.SqlClient'。确保提供商是 在' entityFramework'中注册应用程序配置的一部分 文件
我发现没有此错误的唯一方法是直接引用WCF外观项目中的EntityFramework.SqlServer。但我想将此责任留给repo层本身。所以我需要一种方法以某种方式加载DLL并注册System.Data.SqlClient。有没有人知道这样做的方法还是我只是在做梦?这是我第一次使用Autofac和MEF,而且我远非DI的专家。
由于它是高概念性的,这里有一个带有源代码的小模式,可以帮助您更好地理解:
获取可转换版本here
答案 0 :(得分:1)
也许你可以看看Code-Based Configuration。
创建自定义DbConfiguration
public class MyDbConfiguration : DbConfiguration
{
public MyDbConfiguration()
{
// Other configuration stuff like SetDefaultConnectionFactory
SetProviderServices(
"System.Data.SqlClient",
System.Data.Entity.SqlServer.SqlProviderServices.Instance);
}
}
在DbConfigurationTypeAttribute
DbContext
[DbConfigurationType(typeof(MyDbConfiguration))]
public class MyDbContext : DbContext
{ }
或
[DbConfigurationType("MyNamespace.MyDbConfiguration, MyAssembly")]
public class MyDbContext : DbContext
{ }
从app.config文件中删除entityFramework
配置
修改强>
对于您的顶级项目来查找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?