Это может быть немного странным вопросом, и то, что у меня сейчас есть, работает, но мне кажется немного странным, и мне интересно, что это из-за плохого дизайна / архитектуры. Любые мысли здесь будут оценены.
Первоначальный дизайн в кодовой базе, которую я унаследовал от кого-то другого. У нас есть класс linq-to-sql (автоматически генерируется в файле конструктора dbml).
[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.ARCustomers")]
public partial class ARCustomer : INotifyPropertyChanging, INotifyPropertyChanged
{
// variables
// extensibility method defs
// ctor
// properties
// etc.
}
Затем другой класс класса с именем ArCustomer
(обратите внимание на строчную букву "r"), который является расширенной версией автоматически сгенерированного класса. Когда я говорю «расширенный», я имею в виду, что у него есть все свойства класса LINQ, плюс еще несколько, которые требуют некоторой логики для заполнения.
В коде есть много мест, где мы хотим взять ARCustomer
и превратить его в ArCustomer
. Поэтому я написал метод расширения (это то, что мне показалось странным) для класса ArCustomer
.
public static ArCustomer FromDatacontextObject(this ArCustomer customer, ARCustomer datacontextObject)
{
var arCustomer = new ArCustomer();
arCustomer.Id = datacontextObject.ProjectID;
// more of the same
// now populate the other fields that don't exist on the datacontextObject
return arCustomer;
}
Это называется так.
var customerfromDb = accountReceivableRepository.GetCurCustomer(arId);
ArCustomer customer = new ArCustomer();
customer = customer.FromDatacontextObject(customerfromDb);
Мне кажется, что это неправильно, но я не знаю ни одной лучшей альтернативы в моей голове. (Будет ли работать неполный класс, содержащий расширенные свойства? Заполните их в своем конструкторе?) Или, может быть, все в порядке ... Меня интересуют несколько вещей ...
- Правильно ли я чувствую, что это неправильно / странно / плохо?
- В частности, какие минусы можно найти в реализованном мною решении? Мне кажется, что я слишком часто чешу голову, пытаясь разграничить два класса и понять, что есть что.
- Есть ли у них плюсы?
- Есть ли лучшие решения (и почему они лучше)?
(Несвязанный - я надеюсь, что такой вопрос подходит для переполнения стека. Я почти чувствую, что прошу мини-обзор кода, который может быть субъективным; с другой стороны, я попытался задать некоторые конкретные вопросы и Я чувствую, что не должен быть единственным разработчиком, столкнувшимся с такой ситуацией («У меня есть один объект, и мне нужно превратить его в другой»), так что, надеюсь, есть что-то, что можно получить, если оставить поток открытым).
Спасибо, ребята!