Я хочу отделить Foo
от FooHandler
.Также они должны быть зарегистрированы DI через сканирование сборки.Поэтому у меня есть 3 типа:
interface IFooHandler { // no type arguments, so it can be used by reflection
void DoStuff(object foo);
}
interface IFooHandler<TFoo>: IFooHandler { // TFoo tells us, what foo is it for
void DoStuff(TFoo foo); // developers are happy with strongly typed foos
}
abstract class FooHandler<TFoo>: IFooHandler<TFoo> {
void IFooHandler.DoStuff(object foo){
DoStuff((TFoo)foo); // adapter of interface 2 to 1
}
abstract void DoStuff(TFoo foo); // for nice implementation
}
Проблема с таким дизайном заключается в том, что я не могу легко запретить другим людям в моей сборке использовать IFooHandler
или IFooHandler<TFoo>
напрямую.Использование first - плохая идея, потому что оно не будет зарегистрировано в DI и не получится.Использование second - плохая идея, потому что вы пишете бесполезный шаблон, уже написанный в базовом классе.
Разумно ли добавлять атрибут Obsolete
с error=True
, чтобы люди не могли использовать эти интерфейсы?Есть ли лучший способ их скрыть (я не могу переместить их в другую сборку и пометить как внутреннюю).
Конкретный пример: допустим, у нас есть веб-приложение, и в этой панели для различных типов есть контексты (Foo)которые идентифицируют список опций для данного контекста.Допустим, у вас есть выбор валюты, и Foo CurrencyList
.Затем у вас есть класс CurrencyListProvider
, который принимает CurrencyList, получает доступные валюты из базы данных и возвращает на панель, чтобы пользователь мог выбрать, какую валюту он хочет использовать для транзакции.Я использую конкретные типы, поэтому вы можете легко перемещаться по базе кода с помощью таких инструментов, как resharper, но внутри этих конкретных типов есть строки, проходящие через http.