Динамически составьте тип фасада в C#

#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, поэтому количество параметров конструктора не является проблемой.