Сейчас у нас есть файл 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()));