Это не шаблон репозитория. Шаблон репозитория в основном создает объект, который абстрагируется от постоянства, действуя (концептуально) как совокупность всех объектов определенного типа в домене.
Поэтому хранилище контактов может работать примерно так:
IContacts contacts = GetContactRepository();
using(var uow = UnitOfWork.Create()) {
var contact1 = contacts.Get(new FindByNameSpecification("Fred"));
contact1.LastName = "Rubble";
var contact2 = new Contact("Barney", "Flistone");
contacts.Add(contact2);
// both contact1 and contact 2 are implicitly saved at the end of the unit of work
}
чуть более слабое определение того, как должен работать репозиторий, может выглядеть примерно так:
IContactRepository contacts = GetContactRepository();
using(var uow = UnitOfWork.Create()) {
var contact1 = contacts.GetByName("Fred");
contact1.LastName = "Rubble";
contacts.Save(contact1);
var contact2 = new Contact("Barney", "Flistone");
contacts.Save(contact2);
} //The save is explicit but the commit is implicit
У вас есть шлюз табличных данных .
Проблема в том, что вы создаете один шлюз для каждой таблицы. Я бы рекомендовал против этого.
Является ли пометка частью вашего контактного домена или нет? Если это так, то вы должны иметь свойства
public class Contact {
public IEnumerable<Tag> Tags { get; }
public void TagWith(Tag tag) { .... }
public void UnTag(Tag tag) { ... }
}
Кроме того, спросите себя, будете ли вы когда-либо добавлять тег с нулевыми контактами под ним? Если нет, тогда это становится еще проще - вам вообще не нужен шлюз для управления тегами, просто позвольте объекту Contact справиться с этим
public interface IContactRepository {
IEnumerable<Contact> GetAll(); // returns Contacts along with their tags
void Save(Contact); // saves Contact along with any tags
}
Кстати, если тегирование не является частью вашего домена (так как это касается приложения), то у вас должен быть отдельный сервис, возможно, даже в отдельном проекте
public interface IAssociateTags {
IEnumerable<Tag> GetTagFor(Contact contact);
void TagContact(Contact contact, Tag tag);
void UnTagContact(Contact contact, Tag tag);
}