Параметры универсального класса, используемые как ограничения для универсальных типов членов - PullRequest
0 голосов
/ 17 ноября 2010

Приложение, которое я разрабатываю, должно быть в состоянии извлечь из нескольких различных источников данных, включая пару баз данных SQL.Не идеально, но это приложение, разработанное для интеграции нескольких существующих приложений под одной крышей, поэтому мне приходится работать с имеющейся у меня схемой.

В любом случае, я использую модель репозитория и настраиваю репозиторий для данныхисточник, поэтому мне нужно только создать и сохранить нужные мне соединения в любой момент.Итак, я должен разделить мою модель домена в соответствии с хранилищем, которое сохраняет определенный объект домена, и я должен обеспечить, чтобы объекты, передаваемые в общий метод Save<T> и Query<T>, имели тип, с которым он может работать.Я попробовал это, и вот, он компилируется:

public interface IDomainObject{...}
public interface IOneDomainObject:IDomainObject{...}
public interface IAnotherDomainObject:IDomainObject{...}

public interface IRepository<TRest> where TRest:IDomainObject
{
   ...
   public void Save<T>(T objectToSave) where T:class,TRest //<-- sweet! Didn't think that would work!
   public IQueryable<T> Query<T>() where T:class,TRest
   ...
}

public interface ISecurityRepository:IRepository<IOneDomainObject>{}
public interface IOtherRepository:IRepository<IAnotherDomainObject>{}

Так что я чувствую себя умным, однако я уверен, что бритва Оккама применима здесь где-то.Это пахнет, или это правильный способ определения общей функциональности между классами, которые воздействуют на расходящиеся иерархии объектов?

Ответы [ 2 ]

0 голосов
/ 17 ноября 2010

Код, подобный этому, и есть та самая причина, по которой дженерики были добавлены в C #.Общие алгоритмы, применяемые к разным типам.

0 голосов
/ 17 ноября 2010

Повторяю RPM1984, я видел (и использовал) этот метод много раз, он прекрасно работает. Специально для репозиториев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...