С одной стороны, я мог бы создать хранилище для каждого источника данных, каждый с операцией get и операцией вставки.Тогда я мог бы создать сервис, который следует приведенной выше логике.
Преимущество состоит в том, что вся логика в сервисе, и он чувствует себя немного более "Единой ответственностью".
Мне тоже нравится эта опция, поэтому на вашем месте я бы выбрал эту опцию.
Другой вариант - создать один репозиторий с единственной операцией вставки, которая взаимодействует с обоими источниками данных.Это гарантировало бы, что вы не можете взаимодействовать с одним без другого, но ощущаете себя гораздо менее «Единой ответственностью».
Мне не нравится этот вариант размещения проверки источников данных в одном репо, потому что это звучит какответственность сервисного уровня.
Другой вариант - иметь 3 хранилища.1, который является общедоступным, используется службой (DDD), и этот репозиторий общается с конкретными репозиториями источника данных, которые являются только внутренними.
Я не уверен, что вы подразумеваете под внутренним.Если под внутренним вы имеете в виду internal
как внутри сборки, он по-прежнему имеет тот же недостаток, что и предыдущий параметр.
О первом варианте, который вам и вам нравится, вы говорите так:
Недостатком этого является то, что кто-то может легко прийти на более поздний срок и напрямую использовать «хранилище источника данных 1» и вставить запись, не зная, что ее также следует вставить в источник данных 2.
Мы можем сделать что-то, чтобы избежать этого.Создайте такой класс и представьте, что мы сохраняем Customer
:
public class Customer { }
public class CustomerData
{
public string MyProperty { get; private set; }
private CustomerData()
{
}
public Customer Customer { get; private set; }
// or not void
public static void Save(Customer customer)
{
// Check all datasources and save wherever you need to
// obviously through injection or whatever. I will just
// new-it up here
var cd = new CustomerData { Customer = customer };
var repo1 = new CustomerRepository();
repo1.Save(cd);
bool someCondition = true;
if (someCondition)
{
var repo2 = new CustomerRepository();
repo2.Save(cd);
}
}
}
Обратите внимание, что конструктор является закрытым, поэтому разработчики не могут его создать.Теперь создайте свой репозиторий следующим образом:
public class CustomerRepository
{
public void Save(CustomerData cd) { // Save cd.Customer to datasource }
}
Обратите внимание, что в качестве аргумента принимается CustomerData
.
ОК!Итак, давайте используем репо:
var repo = new CustomerRepository();
// Oops cannot create CustomerData.
// repo has no other method except for CustomerData.
repo.Save(new CustomerData());
// There is no other way except for this or the developer has to add
// a method to the repo-but what can we do about that, not much!
CustomerData.Save(new Customer());