Вместо использования адаптера или полного репозитория (операции CRUD) я бы использовал интерфейс IReader для чтения и шаблона посетителя для удаления вставки update, поэтому вы можете отделить логику домена от деталей инфракрасной (persistance), здесь идея:
public class MyBusinessObject : IAcceptBusinessVisitor, IAcceptMyBusinessIdVisitor
{
private readonly string _id;
private string MyPrivateProp { get; set; }
//Fully encapsulated object
public MyBusinessObject(string id, string myPrivateProp)
{
_id = id;
MyPrivateProp = myPrivateProp;
}
public void UpdateMyProp(string newProp)
{
if (string.IsNullOrWhiteSpace(newProp)) throw new ArgumentNullException(nameof(newProp));
//Business rules ...
MyPrivateProp = newProp;
}
public void Accept(IMyBusinessObjectVisitor visitor)
{
if (visitor == null) throw new ArgumentNullException(nameof(visitor));
visitor.Visit(_id, MyPrivateProp);
}
public void Accept(IMyBusinessIdVisitor visitor)
{
if (visitor == null) throw new ArgumentNullException(nameof(visitor));
visitor.Visit(_id);
}
}
public interface IAcceptBusinessVisitor
{
void Accept(IMyBusinessObjectVisitor visitor);
}
public interface IAcceptMyBusinessIdVisitor
{
void Accept(IMyBusinessIdVisitor visitor);
}
public interface IMyBusinessObjectVisitor
{
void Visit(string id, string prop);
}
public interface IMyBusinessIdVisitor
{
void Visit(string id);
}
public class SavePersistanceVitor : IMyBusinessObjectVisitor
{
public void Visit(string id, string prop)
{
//Save to Database
}
}
public class UpdatePersistanceVitor : IMyBusinessObjectVisitor
{
public void Visit(string id, string prop)
{
//Update to Database
}
}
public class DeleteVitor : IMyBusinessIdVisitor
{
public void Visit(string id)
{
//Delete in Database
}
}
здесь для чтения:
public interface IMyBusinessObjectReader
{
MyBusinessObject Read(string id);
}
class MyBusinessObjectReaderFromDb : IMyBusinessObjectReader
{
public MyBusinessObject Read(string id)
{
//Read from database
string myPrivateProp = "";
return new MyBusinessObject(id, myPrivateProp);
}
}
следующим шагом может быть добавление дженерики для чтения и посетителей. В этом случае вы получаете небольшие классы и получаете гибкость и преимущества от твердых принципов, таких как единая ответственность, сегрегация интерфейса и т. Д. Таким образом, вы можете создать богатый инкапсулированный домен и расширить его функциональность с помощью некоторых принципов. С уважением!
Я не думаю, что есть какое-либо значение при разделении 1 и 2. Код, который взаимодействует между двумя слоями, должен будет преобразовывать данные в и из этого, это заданный. Они делают это даже в GOF, который, как я думаю, не имеет шаблона брокера, возможно, по той причине, что он не отличается от адаптера. 3 это то, что меня волнует, и я сказал, что в моем вопросе. –
@Abhi обычно имеет значение при разделении 1 и 2, и я делал именно это во многих случаях. 1 и 2 практически не связаны между собой. Но вы в лучшем месте, чтобы решить. Пока вы думаете о своем решении и можете объяснить это кому-то, кто хочет знать, почему вы внесли изменения, все будет в порядке. В худшем случае вам нужно сделать еще немного работы позже. Баст, все работает, и все счастливы. – Bohemian