Как решить проблему с использованием Unity в многопроектном решении - PullRequest
7 голосов
/ 10 июня 2010

В новом проекте WPF (VS2010) я впервые использую Unity 2.В этом проекте я использую следующую структуру:

Решение

Проект WPF

Библиотека классов1

Библиотека классов2

Библиотека классов 3....

Регистрация различных типов с использованием Unity осуществляется в проекте WPF с использованием следующего фрагмента:

IUnityContainer container = new UnityContainer()
                            .RegisterType<IObjectContext, ObjectContextAdapter>()
                            .RegisterType<IConnectionStringProvider, ConnectionStringProvider>()
                            .RegisterType(typeof(IRepository<>), typeof(Repository<>));

Предположим теперь, что я хотел бы получить конструктор Repository <Orders>-внедрение разрешено в библиотеке классов1.Очевидно, контейнер не известен в других проектах!

Как бы я это сделал?

Ответы [ 2 ]

10 голосов
/ 26 июня 2010

Я в основном согласен с ответом Криса, но я думаю, что файлы конфигурации не очень удобны (особенно для Unity), поэтому вот решение, которое позволит вам использовать конфигурацию во время выполнения без циклических ссылок. Мы собираемся сделать это с реестрами.

Создайте проект инфраструктуры, который будет содержать IConfigureUnity.

public interface IConfigureUnity
{
    public void Configure(UnityContainer container);
}

Каждый из ваших проектов библиотек классов будет отвечать за реализацию этого интерфейса для регистрации своих собственных классов.

public class RegistryForSomeClassLibrary : IConfigureUnity
{
    public void Configure(UnityContainer container)
    {
        container
            .RegisterType<IObjectContext, ObjectContextAdapter>()
            .RegisterType<IConnectionStringProvider, ConnectionStringProvider>()
            .RegisterType(typeof(IRepository<>), typeof(Repository<>));
    }
}

Тогда в вашем проекте WPF вам нужно будет создать контейнер и применить эти реестры.

var container = new UnityContainer();
new RegistryForSomeClassLibrary().Configure(container);
new RegistryForAnotherClassLibrary().Configure(container);

Теперь у вас есть полностью настроенный экземпляр контейнера без каких-либо файлов конфигурации.

0 голосов
/ 18 июня 2010

Чтобы несколько проектов использовали один и тот же UnityContainer в этом сценарии, вам нужен «общий» проект, который содержит ваш UnityContainer и предоставляет его таким образом, чтобы все другие проекты могли получить к нему доступ.

т.е.

Проект WPF

Библиотека классов 1

Библиотека классов 2

Библиотека классов 3

Общая библиотека (здесь живет UnityContainer)

Чтобы избежать циклических зависимостей проекта, я бы рекомендовал использовать Конфигурация Unity во время разработки через файл конфигурации вместо конфигурации во время выполнения (как у вас в вашем примере).В противном случае вашей общей библиотеке придется ссылаться на проекты, которые содержат все типы, которые она разрешает, и эти проекты, в свою очередь, будут зависеть от общей библиотеки (поскольку это, по-видимому, место, где вы бы выставили экземпляр UnityContainer).Возможно, вы сможете заставить его работать, используя конфигурацию во время выполнения, но я этого не пробовал;Я знаю, что конфигурация во время разработки работает, поскольку я выполнил несколько проектов, используя модель, подобную этой.

...