2009-12-08 3 views
0

Я пытаюсь создать оболочку интерфейса для моего контейнера IOC, поэтому мне не нужно иметь зависимость от конкретного. Моя проблема в том, что некоторые из классов обслуживания, которые я использую в идентификаторе companyID, который является строкой. Я хочу сделать общие методы интерфейса, такие какIOC Контейнер и примитивы при создании обертки

T Resolve<T>() где T - служебный интерфейс.

Сейчас я использую StructureMap за кулисы и узнать, если конкретный конструктор принимает в CompanyID, так что я буду делать что-то вроде этого:

ObjectFactory.With("companyid").EqualTo("someCompanyID").GetInstance<ICompanyService>();

Я обернуть этот вид вызова в методе интерфейса: ICompanyService GetCompanyService(string companyID)

У меня есть это сейчас, приложение должно инициализировать конфигурацию StructureMaps, а конкретный класс, который передает службы, должен знать много о конструкторах. Я бы хотел, чтобы этого не произошло и чтобы сделать обертку общей. Есть ли хороший способ, не добавляя companyID к каждому методу интерфейса?

ответ

2

Лично я не забочусь о абстрагировании MSUnity (мой контейнер IOC по выбору). Для меня это слишком далеко. Похоже, вы используете специфические функции структуры, что сделает абстракцию сложнее.

Вы знаете о CommonServiceLocator project ?. Это имеет основные методы двумя способами:

protected override object DoGetInstance(Type serviceType, string key) { } 
protected override IEnumerable<object> DoGetAllInstances(Type serviceType) {} 

Предоставление вам возможности использовать их, вы можете легко переключиться. Вот some more info.

+0

У меня есть SM абстрагированы немного, только не полностью. Я смотрю на какой-то Open source, который сделал обертку, но не учитывает примитивы в ctors. – CSharpAtl

+0

@ CSharpAtl - пересмотрите свой дизайн. Такие структуры должны работать с самым низким общим знаменателем. Вам нужно решить, важнее ли использование IOC для включения вашего IOC, чем возможность использования специфичных функций StructureMap. – RichardOD

+0

@RichardOD Согласен. – pattersonc

0

В MvcContrib есть класс DependencyResolver.

С другой стороны, большую часть времени я просто возвращаю контейнер IoC из своего проекта приложения. Например, я просто настраиваю свои классы для инъекций ctor, и когда мне нужно захватить экземпляр (в проекте приложения), я просто запрашиваю для него контейнер IoC. Контейнер IoC может беспокоиться о заполнении аргументов ctor, но объекты не знают о контейнере IoC. Таким образом, мой проект приложения - это единственный проект, который должен обновить контейнер IoC.

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