Entity framework 使用实体框架4.1的依赖项注入以及“工作单元”和“存储库”模式
我见过使用工作单元和存储库模式的实体框架的各种实现。理想情况下,我希望为工作单元、数据库上下文、通用存储库和特定存储库使用接口,并在应用程序启动时在引导程序代码中实例化它们。这真的可能吗 检查样本: 没有任何单独的工作类单元,数据库上下文本身实现了IUnitOfwork 使用数据库工厂在不使用DI的情况下实例化数据库上下文,并且数据库上下文不实现接口 在工作单元内实例化数据库上下文和存储库,而无需任何DI 有些实现不使用任何数据库上下文接口,有些在UnitOfWork类中实例化数据库上下文和存储库,并在构造函数中传递具体上下文类,有些在存储库的构造函数中传递工作单元接口,这完全令人困惑。在使用EntityFramework4.1时,是否有一种最佳实践方法允许DI和TDD?是否有一个示例可以证明这一点?到目前为止,我还有下一个示例: 声明:Entity framework 使用实体框架4.1的依赖项注入以及“工作单元”和“存储库”模式,entity-framework,design-patterns,dependency-injection,repository-pattern,unit-of-work,Entity Framework,Design Patterns,Dependency Injection,Repository Pattern,Unit Of Work,我见过使用工作单元和存储库模式的实体框架的各种实现。理想情况下,我希望为工作单元、数据库上下文、通用存储库和特定存储库使用接口,并在应用程序启动时在引导程序代码中实例化它们。这真的可能吗 检查样本: 没有任何单独的工作类单元,数据库上下文本身实现了IUnitOfwork 使用数据库工厂在不使用DI的情况下实例化数据库上下文,并且数据库上下文不实现接口 在工作单元内实例化数据库上下文和存储库,而无需任何DI 有些实现不使用任何数据库上下文接口,有些在UnitOfWork类中实例化数据库上下文和存储
namespace Contracts // Contracts.dll
{
public interface IUserRepository : IUserRepository
{
}
}
实施:
namespace Data // Data.dll
{
class UserRepository : Contracts.IUserRepository
{
}
}
IoC实用程序:
namespace Core // Core.dll
{
public static class IoC
{
private static IUnityContainer _container = LoadContainer();
private static IUnityContainer LoadContainer()
{
var unitySection = (Microsoft.Practices.Unity.Configuration.UnityConfigurationSection)ConfigurationManager.OpenMappedExeConfiguration(
new ExeConfigurationFileMap { ExeConfigFilename = System.Web.HttpContext.Current.Server.MapPath(UserSettings.UnityContainerPath) },
ConfigurationUserLevel.None).GetSection("unity");
var container = new UnityContainer();
unitySection.Configure(container);
return container;
}
public static T Resolve<T>()
{
return _container.Resolve<T>();
}
}
}
Unity.config:
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
</configSections>
<unity>
<containers>
<container>
<types>
<type type="Contracts.IUserRepository, Contracts" mapTo="Data.UserRepository, Data">
<lifetime type="singleton" />
</type>
</types>
</container>
</containers>
</unity>
</configuration>
谢谢你的回复,但我在这段代码中找不到数据库上下文、工作单元模式等。正如我所说,我需要能够为TDD使用所有这些接口,并通过config或fluent API注入具体类型。@RKP:DbContext用于每个声明/实现方法您的IoC类是一个标准的ServiceLocator。ServiceLocator被认为是现代应用程序体系结构中的重要组成部分。@TrueWill是对的:使用fluent API而不是XML。代码不太容易出错,IntelliSense、编译器支持等等。可以找到另一篇关于EF工作单元的非常好的文章。@SebastianWeber:虽然许多人似乎更喜欢Fluent配置,但我认为它有一个缺点。此配置通常在应用程序启动时在UI层中定义,因为它需要为所有接口注入具体类型,所以UI项目需要引用所有其他项目,我不确定这是正确的方法。@abatishchev ServiceLocator本身就是一个反模式,无论何时初始化它。它隐藏了依赖关系,而不是让依赖关系变得显而易见。刚刚看到microsoftnlaperapp,我强烈要求发布ayende的评论。是的,我看过。尽管对它的开发方式存在一些分歧,但仍有一些东西需要从中学习,尤其是随附的指南。不知道为什么到目前为止我的问题还没有答案。也许它太宽泛了,无法回答。