Здравствуйте, Степанов Алексей Александрович, Вы писали:
САА>Имеется несколько библиотек с идентичными интерфейсами.
САА>Требуется в зависимости от некоторых начальных условий САА>использовать ту или иную библиотеку.
САА>Как бы сделать это наиболее прозрачно, т.е. без внесения САА>в основной код, использующий эти интерфейсы, постоянных САА>проверок условий и т.п.
Посмотрите в сторону паттерна AbstractFactory. К примеру:
public abstract class AsbtractComponentFactory
{
public IComponentA CreateComponentA();
}
public class ConcreteComponentFactory
{
public override IComponentA CreateComponentA()
{
return new ConcreteComponentA();
}
}
То есть внутри конкретной фабрики вы можете создавать экземпляры классов конкретной библиотеки. В коде повсеместно для создания объектов используйте абстрактную фабрику и вы избежите проверок.
САА>Может стоит задуматься о рефлекшне? Но не появятся ли САА>неоправданные, в данном случае, тормоза?
Вы можете при старте приложения создать активатором конкретную фабирку и закэшировать ее — в этом случае вопрос быстродействия не сильно пострадает.
Здравствуйте, Степанов Алексей Александрович, Вы писали:
САА>Имеется несколько библиотек с идентичными интерфейсами.
САА>Требуется в зависимости от некоторых начальных условий САА>использовать ту или иную библиотеку.
Во время исполнения программы или во время компиляции?
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, Степанов Алексей Александрович, Вы писали:
САА>>Имеется несколько библиотек с идентичными интерфейсами.
САА>>Требуется в зависимости от некоторых начальных условий САА>>использовать ту или иную библиотеку.
L>Во время исполнения программы или во время компиляции?
Во время исполнения: программа запускается с некоторыми
аргументами и в зависимости от них, должен производиться
выбор необходимой библиотеки.
Здравствуйте, Степанов Алексей Александрович, Вы писали:
САА>Может стоит задуматься о рефлекшне? Но не появятся ли САА>неоправданные, в данном случае, тормоза?
К чему такие сложности?
Просто провайдера библиотек не хватит? Нечто вроде следующего...
IA.cs (общий интерфейс)
namespace ru.rsdn.rsn81.test {
interface IA {
string get();
}
}
A.cs (первая библиотека)
namespace ru.rsdn.rsn81.test {
class A: IA {
public string get() {
return GetType().ToString();
}
}
}
B.cs (вторая библиотека)
namespace ru.rsdn.rsn81.test {
class B: IA {
public string get() {
return this.GetType().ToString();
}
}
}
Provider.cs
namespace ru.rsdn.rsn81.test {
class Provider {
private IA ia;
public Provider(bool condition) {
if (condition)
ia = new A();
else ia = new B();
}
public IA getIA() {
return ia;
}
}
}
Здравствуйте, Степанов Алексей Александрович, Вы писали:
САА>Во время исполнения: программа запускается с некоторыми САА>аргументами и в зависимости от них, должен производиться САА>выбор необходимой библиотеки.
Можно попробовать поиграться с AppDomain.AssemblyResolve. Возможно, что-нибудь и получится.