У меня есть уровень доступа к данным, который возвращает IDataRecord. У меня есть служба WCF, которая обслуживает DataContracts (dto's). Эти DataContracts инициируются параметризованном конструктор, содержащий IDataRecord следующим образом:Общий объект для сопоставления объектов с параметризованным конструктором
[DataContract]
public class DataContractItem
{
[DataMember]
public int ID;
[DataMember]
public string Title;
public DataContractItem(IDataRecord record)
{
this.ID = Convert.ToInt32(record["ID"]);
this.Title = record["title"].ToString();
}
}
Unfortanately Я не могу изменить DAL, поэтому я обязан работать с IDataRecord в качестве входных данных. Но в генерале это работает очень хорошо. Сопоставления довольно простые в большинстве случаев, иногда они немного сложнее, но не ракетостроение.
Однако теперь я хотел бы использовать обобщения для создания экземпляров различных DataContracts для упрощения методов службы WCF. Я хочу быть в состоянии сделать что-то вроде:
public T DoSomething<T>(IDataRecord record) {
...
return new T(record);
}
Так что я попытался следующие решения:
Используйте общий типизированных интерфейс с конструктором. не работает: конечно, мы не можем определить конструктор в интерфейсе
Использовать статический метод для создания экземпляра DataContract и создания типизированного интерфейса, содержащего этот статический метод. не работает: конечно, мы не можем определить статический метод в интерфейсе
Использовать общий типизированный интерфейс, содержащий новое() ограничение не работает: новое() ограничение не может содержать параметр (IDataRecord)
Использование фабричного объекта для выполнения сопоставления на основе типа DataContract. действительно работает, но: не очень чистый, потому что теперь у меня есть оператор switch со всеми отображениями в одном файле.
Я не могу найти настоящего чистого решения для этого. Может ли кто-нибудь пролить свет на это для меня? Проект слишком мал для любых сложных методов сопоставления и слишком велик для реализации на основе «коммутатора».
Я на самом деле пошел так. Я знал automapper, но я предполагал, что это слишком сложно для этого случая. Однако получается, что это было сложно и очень просто! Благодаря! –