Microsoft Unity 2, как зарегистрировать следующее? - PullRequest
0 голосов
/ 19 мая 2011

Сейчас у нас есть файл DLL, который содержит все вызовы базы данных, и я не могу его изменить.Однако мне нужно позвонить мне из моего проекта Mvc 3.Процесс для его вызова прост, я использую следующее:

ManageProvider.GetProxy<T>(ident);

T - это интерфейс, от которого я хочу получить класс (он как собственный IoC), а идентификатор - идентификатор пользователя.учебный класс.Поэтому, позвонив

var classReturned = ManageProvider.GetProxy<ICommunity>(new UserIden{ Email = "test@test.com" });

, я бы вернул класс со всеми функциями сообщества.Теперь я хочу внедрить Unity в мой проект Mvc 3.Вопрос в том, могу ли я как-то добавить эти вызовы в файл dll через единство?

Я хочу разрешить вызов с помощью:

var classReturned = myContainer.Resolve<ICommunity>(new UserIden{ Email = "test@test.com" });

Как я могу зарегистрировать это в Unity (илиэто вообще возможно)?

Обновление:

1) Лучше ли вызывать методы с идентификатором email / user вместо определения свойства Dependency?(пример ниже)

2) Сейчас в файле dll около 20 интерфейсов.Должен ли я добавить их все в один и тот же репозиторий?(пример ниже)

    public class ProxyWrapper : IDllRepository
    {
        [Dependency]
        public UserIdent UserIdent { get; set; }

        public ICommunity GetCommunity()
        {
            return ManageProvider.GetProxy<ICommunity>(UserIdent);
        }

        public IDesktop GetDesktop()
        {
            return ManageProvider.GetProxy<IDesktop>(UserIdent);
        }
    }

    public interface IDllRepository
    {
        ICommunity GetCommunity();
        IDesktop GetDesktop();
    }

Какой самый лучший способ и как бы я назвал его из своего кода?Атрибут [Зависимость] также попадает в анти-шаблон Service Locator?

Обновление 23.05.11

1) Да, что-то в этом роде.Они содержат всю логику, которая предоставляется всем проектам, включающим файл dll.

Относительно ManagerProvider.Он принимает интерфейс и возвращает класс, который сопоставлен с этим интерфейсом.Таким образом, для сообщества интерфейс выглядит следующим образом (удалено много звонков, чтобы сделать его коротким, есть также посты, комментарии, создание / обновление сообщества и т. Д.):

List<CommunityThread> GetThreads(int pStartRowIndex, int pMaximumRows, string pOrderBy, string pSearchExpression);
Guid? CreateThread(string pTitle, string pDescription, string pPostContent);
bool DeleteThread(Guid pThreadId);
List<CommunityThread> GetCommunityUserThreads(Guid pCommunityUserId); 

2) Что я могу 'Обновление - это то, как работает ManageProvider.GetProxy.GetProxy - это класс в файле DLL, который жестко закодирован.Вот часть для сообщества.Класс делает то же самое для всех остальных интерфейсов, если typeof (interface) ... возвращает класс.

private static IManageProxy GetProxyForInterface<T>(UserIdent pIdent)
{
....
     if (typeof(T).Equals(typeof(ICommunity)))
          return new PCommunity();
....
}

3) После регистрации с использованием этого нового класса-обертки я могу вызвать его с помощью следующегокод (MvcUnityContainer - это статический класс, который имеет только свойство с именем Container):

var c = MvcUnityContainer.Container.Resolve<IBackendRepository>(new PropertyOverride("UserIdent",
                                                                           new UserIdent()));

Global.asax

IUnityContainer container = InitContainer();                                 
MvcUnityContainer.Container = container;
DependencyResolver.SetResolver(new UnityMvcResolver(container));

Вопрос в том, нужен ли мне статический класс MvcUnityContainer?Можно ли настроить DependecyResolver, чтобы сделать это для меня?Что-то вроде (проблема в том, что он не принимает параметр переопределения):

var c = DependencyResolver.Current.GetService<IBackendRepository>(new PropertyOverride("UserIdent", new UserIdent()));

Ответы [ 2 ]

3 голосов
/ 20 мая 2011

Я думаю, что вам нужно скрыть создание за другой абстракцией, например:

public interface ICommunityRepository
{
    ICommunity GetByEmailAddress(string address);
}

public class ManageProviderCommunityRepository
    : ICommunityRepository
{
    public ICommunity GetByEmailAddress(string address)
    {
        var id = new UserIden { Email = address };
        return ManageProvider.GetProxy<ICommunity>(id);
    }
}

Это скроет ManageProvider и UserIden за этой абстракцией и позволит вам заменить егопозже с чем-то более полезным и облегчающим тестирование.

Регистрация теперь очень проста:

RegisterType<ICommunityRepository, ManageProviderCommunityRepository>();

Вместо вызова myContainer.Resolve (как вы делаете в своем примере), введите зависимостив ваших классах.Это не позволяет использовать анти-шаблон Service Locator .

0 голосов
/ 20 мая 2011

Возможно, вы могли бы сделать что-то подобное, используя InjectionFactory:

    myContainer.RegisterType<ICommunity>(
        new InjectionFactory(c => ManageProvider.GetProxy<ICommunity>(new UserIden {Email = "test@test.com"})));
    var classReturned = myContainer.Resolve<ICommunity>();

... Хотя вы не сможете передать UserIden в качестве параметра в вызов Resolve, поэтому я не уверен, что это то, что вам нужно.

Чтобы зарегистрировать все открытые классы сборки, возможно, вы могли бы перебрать Assembly.GetTypes () и зарегистрировать их таким же образом?

...