2010-09-15 5 views
1

Я пытаюсь найти контейнер IOC, который позволит мне иметь данные сопоставления для поля, хранящегося в базе данных, и разрешать интерфейс или объект, которые необходимо разрешить с помощью строкового значения, извлеченного из базы данных.Решение Runtime IOC Container

Большинство примеров, которые я видел, используют интерфейсы, жестко закодированные в коде, я хочу, чтобы интерфейс, который должен быть разрешен, был динамическим.

Это то, что я обычно вижу:

var taskController = container.Resolve<ITaskController>(); 

Это то, что я хотел бы видеть:

var strTaskController = "ITaskController"; 
var taskController = container.Resolve(strTaskController); 

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

ответ

2

Используя Unity вы можете делать то, что ищете. В принципе, если вы знаете полное имя типа, вы можете сделать это первым:

var type = Type.GetType("Fully.Qualified.Type.Name"); 
var resolvedInstance = container.Resolve(type); 

EDIT: Основываясь на комментарий, здесь другой подход:

string typeName = "MyTypeName"; 
var type = container.Registrations.FirstOrDefault(r => r.RegisteredType.Name == typeName); 
if(type != null) 
{ 
    var resolvedInstance = container.Resolve(type.RegisteredType); 
} 
+0

Возможно, я не знаю полного имени типа. Используя отражение, я все еще могу получить объект Type для интерфейса из сборки, но я надеялся, что это может сделать контейнер, поскольку он уже имеет метаданные о том, какие типы загружены для разрешения. – Firestrand

+0

Достаточно честный. Единственный другой вариант (с помощью Unity) - это прокрутить коллекцию регистрации UnityContainer, которая предоставляет вам коллекцию объектов ContainerRegistration, на которой есть свойство RegisteredType. Вы можете сопоставить имя типа этого типа с тем, что у вас уже есть, и если они совпадают, вы можете использовать этот тип для решения, используя описанный метод. Я отредактирую свой пост с образцом ... – BFree

-1

Вы можете использовать контейнер МОК от Castle project.

+0

Ссылка на пример? Я просмотрю документацию, но этого я и надеялся избежать. – Firestrand

+0

Подумайте над своим ответом, вместо того, чтобы просто надеяться получить очки за то, что сказал «Проект замка». – Nix

+0

@Firestrand: Вы запрашивали контейнер, который может разрешить тип, заданный строкой. Виндзор может это сделать. Но вам придется самостоятельно инициализировать сопоставления. Мне не на 100% ясно, какие данные вы сохранили в своих таблицах. Я полагаю, что у вас есть какое-то сопоставление от имени до полностью квалифицированного имени типа? Или что? Мне трудно помочь вам с примером, не зная об этом. –

0

Я думаю, что это ответ, который я иду с .. Управляемый Расширяемость Framework http://msdn.microsoft.com/en-us/library/dd460648.aspx

Got любить его, когда вы найдете новую структуру, чтобы найти точное решение вашей проблемы.

Смежные вопросы