2015-03-18 3 views
0

Предположим, что у меня есть следующие иерархии, я хотел бы создать экземпляр с DI:Определение отдельной инъекции для определенного интерфейса

DatabaseService(IDatabaseRepository) : IDatabaseService 
Database1Service(IDatabaseRepository) : IDatabase1Service 
Database2Service(IDatabaseRepository) : IDatabase2Service 
DatabaseRepository(IUnitOfWork) : IDatabaseRepository 
DatabaseRepository2(IUnitOfWork) : IDatabaseRepository 
UnitOfWork(string) : IUnitOfWork 

Есть ли способ в Stucturemap, что позволит мне это сделать?

public class MyRegistry : Registry 
{ 
    public MyRegistry() 
    { 
     //default-convention-scan code here 

     //this is the unit of work for almost all of my interface implementations 
     //i.e. new DatabaseService(new DatabaseRepository(new IUnitOfWork("Database1"))) 
     // new Database1Service(new DatabaseRepository(new IUnitOfWork("Database1"))) 
     For<IUnitOfWork>() 
      .Use(new UnitOfWork("Database1")); 

     //Database2Service needs a separate implementation Of UnitOfWork 
     //i.e. new Database2Service(new DatabaseRepository(new IUnitOfWork("Database2"))) 
     For<IUnitOfWork>().IfDescendantDependencyOf<IDatabase2Service>() 
      .Use(new UnitOfWork("Database2")) 
    } 
} 

Если это не ясно, я хочу, чтобы все впрыскивается IUnitOfWork с, чтобы указать на одноэлементных new UnitOfWork("Database1"), за исключением, если он был введен при попытке построить экземпляр IDatabase2Service, где он должен использовать синглтон new UnitOfWork("Database2").

+0

Do обе базы данных разделяют ту же самую схему базы данных? – Steven

+0

Скажем, «да». – Arithmomaniac

+0

В этом случае вы нарушаете Принцип замещения Лискова. Вы должны создать другой интерфейс для второй базы данных. – Steven

ответ

0

Это может быть достигнуто с помощью следующей конфигурации:

public class MyRegistry : Registry 
{ 
    public MyRegistry() 
    { 
     this.For<IUnitOfWork>().Use(new UnitOfWork("Connection1")); 
     this.For<IDatabase2Service>().Use<Database2Service>().Ctor<IUnitOfWork>().Is(new UnitOfWork("Connection2")); 
    } 
} 
+0

Это работает и для потомков, как в обновленном вопросе? – Arithmomaniac

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

  • Нет связанных вопросов^_^