Бизнес-уровень обрабатывает Linq-объекты, не зная об этом? - PullRequest
1 голос
/ 06 апреля 2011

Я рефакторинг своего приложения, чтобы меньше зависеть от источника данных (в настоящее время я использую Linq To Sql).Но мне нравится, как Linq To Sql генерирует мои классы из моей базы данных и отслеживает изменения.

Если бы это был не Linq, я бы просто обернул класс интерфейсом, а затем позволил своему бизнес-уровню зависеть от этого интерфейса.Однако я не могу сделать это с помощью linq.

Итак, допустим, у меня есть хранилище IFooRepository, где Foos - это таблица в базе данных, а Linq сгенерировал для меня класс Foo.Если бы я не беспокоился о зависимостях, я бы просто возвратил объект linq Foo.Но мой слой бизнес-логики не имеет понятия о моем слое Linq, поэтому я не могу внедрить эти объекты в свой BLL.И поскольку мои объекты Linq не могут реализовать какой-либо интерфейс, у меня не может быть никаких функций в IFooRepository, возвращающих реализацию IFoo.

Итак, я хочу, чтобы мой BLL обрабатывал объекты Linq, но не зная об этом,что мой слой Linq будет отслеживать изменения BLL.Это возможно?Я имею в виду просто наследовать класс от объекта Linq, а затем использовать его для передачи.Это будет действительным?

Ответы [ 2 ]

2 голосов
/ 06 апреля 2011

Ваши сущности LINQ-to-SQL могут реализовывать интерфейсы, и вы можете добавлять к ним любые функции, которые вам нравятся. Сгенерированные сущности - это partial классы, поэтому вы можете сделать что-то похожее на это в другом файле, если он является частью вашей сборки LINQ-to-SQL:

public partial class YourEntityType : IInterfaceName
{
    // your implementation
}

Вам просто нужно определить контракты в другой сборке, на которую ссылаются как сборка LINQ-to-SQL, так и сборка бизнес-логики.

1 голос
/ 06 апреля 2011

Это, безусловно, возможно, особенно с LINQ to SQL. Здесь нужно сделать две вещи:

  1. Используйте POCO объекты (см. здесь и здесь для автоматизации T4).
  2. Скрыть DataContext за абстракцией .

Удачи.

...