0

У меня есть интерфейс IA и реализации A:IA и B:IA. Реализация B имеет зависимость от IA с конструктором DI, так что B.ctor(IA).Регистрация IoC для класса обертки

Целью этого проекта является обертывание A с помощью B и использование их для взаимозаменяемости. A - это адаптер для базы данных, а B позволяет кэшировать эти данные.

IA также зависит от классов поставщиков в этой системе, поэтому, когда я регистрирую эти провайдеры, я хотел бы использовать экземпляр B. Мой график объект должен в основном выглядеть следующим образом:

new Provider(
    new B(
     new A(
      new DbContex("constr") 
     ) 
    ) 
) 

, я рассматривал возможность использования интерфейса мечения таким образом, что IB:IA и B:IB, но тогда я должен был бы зависеть от IB моих поставщиков вместо IA, который не был бы идеальным.

Я также рассмотрел использование фабрики для IA, которая создает экземпляр B с использованием экземпляра A, но это кажется неправильным.

Итак, я предполагаю, что я ищу способ выполнить эту регистрацию с использованием контейнера IoC простого инжектора.

Пример кода класса

public class A : IA 
{ 
    private readonly DbContext _context; 

    public A(DbContext context) 
    { 
     _context = context; 
    } 

    public T Get<T>() 
    { 
     // Do stuff to get and 
     // return value from database. 
    } 

    public void Set<T>(T value) 
    { 
     // Do stuff to set value 
     // in database. 
    } 
} 

Wrapper:

public class B : IA 
{ 
    private readonly IA _adapter; 

    public B(IA adapter) 
    { 
     _adapter = adapter; 
    } 

    public T Get<T>() 
    { 
     // Do stuff to get and 
     // return value from cache 
     // or database adapter. 
    } 

    public void Set<T>(T value) 
    { 
     // Do stuff to set value 
     // in cache and database. 
    } 
} 

Потребитель IA:

public class Provider 
{ 
    private readonly IA _adapter; 

    public Provider(IA adapter) 
    { 
     _adapter = adapter; 
    } 
} 

ответ

3

Что вы ищете известен как decorator pattern.

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

Здесь вы можете прочитать все о подсистеме декоратора: Aspect-Oriented Programming в документации.

Для этого основополагающего случае регистрации, необходимых прост:

container.Register<IA, A>(); 
container.RegisterDecorator<IA, B>(); 

И не забудьте поставить «IA» в CTOR Б.

+0

замечательного! Огромное спасибо :) – Ablue

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