Подтвердить что ты не робот

Должны ли вы использовать частичный класс для разных проектов?

У меня есть библиотека классов со всей моей логикой базы данных. Мой DAL/BLL.

У меня есть несколько веб-проектов, которые будут использовать одну и ту же базу данных и классы, поэтому я подумал, что было бы неплохо абстрагировать слой данных в своем собственном проекте.

Однако, когда дело доходит до добавления функциональности к классам для некоторых проектов, я хочу добавить методы к определенным классам.

Например, в моем слое данных есть объекты Product и SomeItem:

// Data Access Layer project

namespace DAL {
  public class Product { 
     //implementation here 
  }

  public class SomeItem {
     //implementation here 
  }
}

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

// This is in Web Project
namespace DAL {
  public partial class Product : ICustomBehaviour {

    #region ICustomBehaviour Implementation
       TheSharedMethod();
    #endregion
  }
}

Хорошо ли написать частичный класс в отдельном проекте (создание зависимости) с использованием того же пространства имен? Если это плохая идея, как я могу заставить эту функцию работать?

Кажется, он не хочет объединять их во время компиляции, поэтому я не уверен, что я делаю неправильно.

4b9b3361

Ответ 1

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

(Ваш исходный файл DAL должен был бы объявить класс также частичным, как, кстати.)

Ответ 2

Я не могу ответить на ваш вопрос о наилучшем способе организации ваших слоев, но я могу попытаться ответить на ваш вопрос о том, как лучше всего эмулировать частичные классы.

Вот несколько мыслей:

  • Первое, что приходит на ум - это наследование. Это не всегда лучшее решение всегда, но у вас может не быть выбора, поскольку вам может потребоваться, чтобы ваши объекты могли обрабатываться как базовый класс.
  • Композиция также является хорошим выбором (т.е. переносом класса в другой класс). Это дает вам немного более приятную развязку от вашего DAL, но может быть утомительным для реализации.
  • Если вам действительно нужно добавить метод или два в существующий класс, вы также можете рассмотреть возможность использования метода расширения , но это может быстро создайте код спагетти, если вы слишком много используете их.

Ответ 3

Частичные классы должны существовать в одной и той же сборке. В противном случае, как компилятор решит, где слить частичные классы в?

Ответ 4

Я не вижу причин, почему эта схема не срабатывала:

Два файла содержат механизмы хранения (или некоторые другие функции). Они определяют наследование, но не содержат бизнес-логики:

  • ProductDataAccess.cs
  • ProductWeb.cs

Один файл содержит бизнес-логику:

  • ProductBusinessLogic.cs

Теперь создайте два проекта:

  • WebProject содержит ProductWeb.cs и ProductBusinessLogic.cs.
  • DataProject содержит ProductDataAccess.cs и ProductBusinessLogic.cs

Оба проекта используют одну и ту же бизнес-логику.

Ответ 5

Я согласен с ответом Джона Скита.

Я не думаю, что было бы неплохо подойти к такой проблеме. Есть уже неплохие шаблоны дизайна, которые демонстрируют лучший способ разделить уровни/уровни кода, и это всего лишь небольшой синтаксический сахар, чтобы Microsoft могла сделать отдельные файлы дизайнеров WinForms/WebForms отдельными и не позволить людям их нарушать.

Ответ 6

В то время как я согласен с вами в том, что касается развития pre-linq, я также хотел бы сделать это, чтобы разделить бизнес-логику с частичными классами, созданными дизайнером Linq2SQL. Например:

Northind.DAL (prj)
-NorthindDataContext (EntityNamespace set to "Northwind.BLL")
--Product() (Entity, partial class auto-generated)
--Category() (Entity, partial class auto-generated)
--Supplier() (Entity, partial class auto-generated)

Northind.BLL (prj)
-Product() : IMyCustomEnityInterface, BaseEntity (override OnValidate(), etc)
-Category() : IMyCustomEnityInterface, BaseEntity (override OnValidate(), etc)
-Supplier() : IMyCustomEnityInterface, BaseEntity (override OnValidate(), etc)

К сожалению, мы не можем этого сделать... На самом деле мне бы хотелось узнать, какой рекомендуемый способ разделения слоев/уровней при использовании LINQ.

Ответ 7

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