использование внедрения зависимостей для Entity Framework 4.1 вместе с шаблонами «Unit of Work» и «Repository» - PullRequest
1 голос
/ 28 декабря 2011

Я видел различные реализации Entity Framework с использованием шаблонов единиц работы и репозитория.в идеале я хочу использовать интерфейсы для единицы работы, контекста базы данных, репозитория (как для общих, так и для конкретных репозиториев) и создавать их экземпляры в коде BootStrapper при запуске приложения.Действительно ли это возможно?

проверенных образцов:

http://microsoftnlayerapp.codeplex.com (не имеет отдельной единицы рабочего класса, сам контекст базы данных реализует IUnitOfwork)

http://efmvc.codeplex.com (использует фабрику базы данных для создания экземпляра контекста базы данных без использования DI, а контекст базы данных не реализует интерфейс)

http://code.msdn.microsoft.com/ASPNET-MVC-Application-b01a9fe8 (создает контекст базы данных и хранилища внутри единицы работыбез DI)

некоторые реализации не используют какой-либо интерфейс для контекста базы данных и некоторые экземпляры контекста базы данных и репозитории внутри класса UnitOfWork и передают конкретный класс контекста в конструкторе, а некоторые передают интерфейс для единицы работыв конструкторе для хранилища, и это полностью сбивает с толку.Существует ли лучший метод, который позволяет использовать DI и TDD при использовании Entity Framework 4.1?Есть ли образец, который демонстрирует это?

1 Ответ

0 голосов
/ 28 декабря 2011

На данный момент у меня есть следующее:

Декларация:

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>
...