Generic repository в WCF

178
06 февраля 2018, 06:35

Имеется dll, в которой есть сущности и класс для работы с бд (используется рефлексия). Например, у меня обращение в клиенте DataManager.Instance.User.GetList(); Где DataManager это singleton class. Как можно реализовать это в хосте WCF, не могу определить сущность для работы.

public class AtelierSevice : IAtelierService
{
    public int Add(T item)
    {
       return DataManager.Instance.User.Add(item);
       DataManager.Instance. //Здесь необходимо узнать к какому репозиторию я обращаюсь
    }
    public void Delete<T>(int id)
    {
        throw new NotImplementedException();
    }
    public List<T> GetList<T>()
    {
        throw new NotImplementedException();
    }
    public void Update<T>(T item)
    {
        throw new NotImplementedException();
    }
}

Возможно я объяснил не понятно.

Answer 1

В WCF дженерики не предусмотрены by design:

Type 'T' cannot be exported as a schema type because it is an open generic type.

Т.е. вот так не получится у вас:

[OperationContract]
void AddItem<T>(T item);

PS Если поискать на английском so то вроде как есть пара сторонних проектов, но сам не пробовал.

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

Update

что вы имеете ввиду, говоря, что тащу CRUD-операции через WCF. Просто у меня в отдельной библиотеке работа с базой. Не понимаю, как предоставить пользователю методы из этой библиотеки. Например, я работаю в коде клиента с классом User, передаю данные на изменение, как мне узнать, что я передал именно User.

При проектировании приложений принято скрывать реализацию, потому что она может поменяться. База данных – это деталь реализации, легко может поменяться: сегодня MS SQL, завтра Oracle, послезавтра – что-то модное из мира NoSql.

Устройство приложения обычно выглядит следующим образом:

  • слой домена. В нём находятся ваши сущности, связанные с моделируемой областью и вся бизнес-логика (и нет никакой работы с базой данных)
  • слой работы с базой данных. В нём находятся репозитории, которые понимают как читать и писать в базу ваши модели.
  • сервисный слой. В нём находятся сервисы, которые (используют репозитории и) предоставляют приложению методы для работы

Так вот вы предоставляете доступ к слою базы данных (все до единого репозитории) и этим переносите всю логику работы в совершенно неподходящее место. Это как если бы Сбербанк отдал бы вам WCF сервис, которым бы можно было вставлять данные в таблички БД: никакого контроля бизнес-операций, вставляй что хочешь.

Вам нужно предоставлять доступ к слою сервисов. Вы уже запрещаете вставлять данные напрямую в таблицы, но отдаёте методы, которые сами предварительно будут выполнять проверку бизнес-логики и потом уже сами начнут дёргать нужные репозитории.

READ ALSO
Как указать путь к файлу с использованием %USERNAME%?

Как указать путь к файлу с использованием %USERNAME%?

При создании файла или при его чтении я хочу указать путь таким образом, чтобы не приходилось вводить имя пользователяКак это делается в windows:...

154
Entity Framework Code First, получить объект через ключ

Entity Framework Code First, получить объект через ключ

Есть проект на C#, использующий Entity Framework Code First

207
Unity IAP Win10

Unity IAP Win10

Собираем билд в Юнити под Win10 Universal, backend выбираемnet

172
Ошибка в кодировке русских символов

Ошибка в кодировке русских символов

ЗдравствуйтеСоздал пустое asp

157