使用Entity Framework 4.1的依赖注入以及“工作单元”和“存储库”模式

时间:2011-12-28 17:52:11

标签: entity-framework design-patterns dependency-injection repository-pattern unit-of-work

我已经看到了使用工作单元和存储库模式的Entity Framework的各种实现。理想情况下,我想使用工作单元,数据库上下文,存储库(对于通用和特定存储库)的接口,并在应用程序启动时在BootStrapper代码中实例化它们。这实际上是可能的吗?

检查样品:

http://microsoftnlayerapp.codeplex.com(没有任何单独的工作类单元,数据库上下文本身实现了IUnitOfwork)

http://efmvc.codeplex.com(使用数据库工厂实例化数据库上下文而不使用DI,数据库上下文不实现接口)

http://code.msdn.microsoft.com/ASPNET-MVC-Application-b01a9fe8(在没有任何DI的情况下实例化数据库上下文和工作单元内的存储库)

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

1 个答案:

答案 0 :(得分:0)

到目前为止我有下一个:

声明:

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>