Должны ли вы использовать частичный класс для разных проектов?
У меня есть библиотека классов со всей моей логикой базы данных. Мой 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
}
}
Хорошо ли написать частичный класс в отдельном проекте (создание зависимости) с использованием того же пространства имен? Если это плохая идея, как я могу заставить эту функцию работать?
Кажется, он не хочет объединять их во время компиляции, поэтому я не уверен, что я делаю неправильно.
Ответы
Ответ 1
Вы не можете написать частичный класс для всех проектов. Частичный класс - это часть синтаксического сахара, составляющая только время компиляции, - весь тип заканчивается в одной сборке, то есть в одном проекте.
(Ваш исходный файл DAL должен был бы объявить класс также частичным, как, кстати.)
Ответ 2
Я не могу ответить на ваш вопрос о наилучшем способе организации ваших слоев, но я могу попытаться ответить на ваш вопрос о том, как лучше всего эмулировать частичные классы.
Вот несколько мыслей:
- Первое, что приходит на ум - это наследование. Это не всегда лучшее решение всегда, но у вас может не быть выбора, поскольку вам может потребоваться, чтобы ваши объекты могли обрабатываться как базовый класс.
- Композиция также является хорошим выбором (т.е. переносом класса в другой класс). Это дает вам немного более приятную развязку от вашего DAL, но может быть утомительным для реализации.
- Если вам действительно нужно добавить метод или два в существующий класс, вы также можете рассмотреть возможность использования метода расширения , но это может быстро создайте код спагетти, если вы слишком много используете их.
Ответ 3
Частичные классы должны существовать в одной и той же сборке. В противном случае, как компилятор решит, где слить частичные классы в?
Ответ 4
Я не вижу причин, почему эта схема не срабатывала:
Два файла содержат механизмы хранения (или некоторые другие функции). Они определяют наследование, но не содержат бизнес-логики:
- ProductDataAccess.cs
- ProductWeb.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
Нет. Вы не можете писать частичные классы в разных проектах. Потому что в то время компилятор получает один проект для компиляции и поэтому проверяет только список классов, методов, полей и т.д. В этом случае, если у вас есть некоторые части частичный класс в других проектах, компилятор не может найти их.