Я думаю, что вариант 2 не плохой, но может и не понадобиться. Микро-сервисы предназначены для того, чтобы вы могли удовлетворить потребности нескольких приложений.
Важным фактором здесь является то, есть ли какая-либо разница между двумя схемами и будет ли когда-либо в будущем.
Обычно я думаю, что использование интерфейсов для репозиториев не нужно; однако, это может стоить усилий в этом случае. Хранилища заводов будут важны для вас.
Моя проблема с вариантом 1 заключается в том, что он слишком конкретен. Вы должны быть в состоянии перейти от установки, которую вы описали, к двум отдельным экземплярам, каждый из которых легко указывает на свою собственную БД. Приложение не должно заботиться о том, где оно получает данные.
Хотя схема не отличается для двух разных баз данных, вы можете иметь один репозиторий, который легко справится с обоими, и приложение не будет знать разницу:
public class MyEntityRepository : ISavesMyEntity, IGetsMyEntity
{
public MyEntityRepository(string connectionString)
{
_connectionString = connectionString;
}
}
public class MyEntitySaverFactory
{
public ISavesMyEntity GetSaver(User user)
{
if (user.IsUK)
return new MyEntityRepository(Config.Get("UKConnString"));
if (user.IsUS)
return new MyEntityRepository(Config.Get("USConnString"));
throw new NotImplementedException();
}
}
//USE
ISavesMyEntity saver = factory.GetSaver(currentUser);
saver.Save(myEntityInstance);
Если схемы БД когда-нибудь станут несопоставимыми между США и Великобританией, вы затем разделите функциональность на два совершенно разных репозитория. Это было бы легко, поскольку все, что вам нужно было бы сделать - это сменить завод.