#c# #code-generation #roslyn #castle-dynamicproxy
Вопрос:
У меня много классов ( Component1
, Component2
…), каждый из которых реализует один интерфейс ( IService1
, IService2
).
Однако для публикации этих классов в API (WCF) мне нужно создать такой тип:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.PerCall)] public class CompositeService : IService1, IService2 { private readonly Component1 _provider1; private readonly Component2 _provider2; public CompositeService(Component1 comp1, Component2 comp2) { _provider1 = comp1; _provider2 = comp2; } public double IService1.MethodA() { return _provider1.MethodA(); } public string IService2.MethodB(string par1, out string par2, ref string par3) { return _provider2.MethodB(par1, out par2, ref par3); } }
Теперь мне нужно сопоставить несколько сотен методов, и я хотел бы найти способ автоматического подключения CompositeService
типа.
В настоящее время я играю с двумя подходами:
Microsoft.CSharp.CSharpCodeProvider
и шаблонизация строк, но генерация шаблона может усложниться, чтобы учесть каждый тип параметра. Однако код довольно прост.Castle.DynamicProxy
вCastle.Core
, который, похоже, является своего рода отраслевым стандартом и имеет невероятно плохую документацию для того, чтобы быть таким зрелым и мощным. «За», по-видимому, заключается в том, что вызов должен быть легким, «против» заключается в том, что мне нужно составить много классов и раскрыть каждый из них, что не является «стандартным» вариантом использования, поэтому я не уверен, смогу ли я его использовать.
Как я мог сочинять эти уроки? Я использую платформу DI, поэтому количество параметров конструктора не является проблемой.