Entity framework 使用实体框架4.1的依赖项注入以及“工作单元”和“存储库”模式

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类中实例化数据库上下文和存储

我见过使用工作单元和存储库模式的实体框架的各种实现。理想情况下,我希望为工作单元、数据库上下文、通用存储库和特定存储库使用接口,并在应用程序启动时在引导程序代码中实例化它们。这真的可能吗

检查样本:

没有任何单独的工作类单元,数据库上下文本身实现了IUnitOfwork

使用数据库工厂在不使用DI的情况下实例化数据库上下文,并且数据库上下文不实现接口

在工作单元内实例化数据库上下文和存储库,而无需任何DI

有些实现不使用任何数据库上下文接口,有些在UnitOfWork类中实例化数据库上下文和存储库,并在构造函数中传递具体上下文类,有些在存储库的构造函数中传递工作单元接口,这完全令人困惑。在使用EntityFramework4.1时,是否有一种最佳实践方法允许DI和TDD?是否有一个示例可以证明这一点?

到目前为止,我还有下一个示例:

声明:

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的评论。是的,我看过。尽管对它的开发方式存在一些分歧,但仍有一些东西需要从中学习,尤其是随附的指南。不知道为什么到目前为止我的问题还没有答案。也许它太宽泛了,无法回答。