Интерфейс на 4 интерфейса? - PullRequest
2 голосов
/ 10 июня 2011

У меня довольно большое приложение для базы данных, и я пытаюсь использовать шаблон репозитория.

У меня есть 4 интерфейса: IProductRepository, IFileRepository .... и я хочу иметь комбинированный интерфейс для всех 4, который я хочу использовать как API для других частей приложения.Должен ли я иметь класс и ввести все методы четырех интерфейсов и добавить интерфейс к этому классу?Похоже, много работы.Так как у каждого из 4 есть много методов, я не хотел бы вводить их все снова.

Или как мне решить это самым чистым и приятным способом?

Ответы [ 5 ]

4 голосов
/ 10 июня 2011

Из вашего описания это звучит так, как будто Фасад должен соответствовать всем требованиям.

http://www.dofactory.com/Patterns/PatternFacade.aspx

1 голос
/ 10 июня 2011

Да.Это может быть недостатком использования интерфейсов.Единственный хороший способ сделать это терпимым - это использовать какой-то инструмент генерации кода.Что-то вроде T4 .

1 голос
/ 10 июня 2011

Да, насколько я знаю, другого пути нет. Но такие инструменты, как Resharper, делают все это намного проще.

0 голосов
/ 10 июня 2011

Еще один вариант - использовать инструмент, подобный Dynamic Proxy , и смешивать реализации репозитория.Это избавило бы вас от необходимости создавать реализацию перенаправления вручную.

Пример:

public class Product 
{
}
public interface IProductRepository
{
    void Save(Product p);
}
public class ProductRepository : IProductRepository
{
    public void Save(Product p)
    {
        Console.WriteLine("Saved Product");
    }
}

public class File 
{
}
public interface IFileRepository
{
    void Save(File f);
}
public class FileRepository : IFileRepository
{
    public void Save(File f)
    {
        Console.WriteLine("Saved File");
    }
}

public class Repository 
{
}

Создать миксин:

var options = new ProxyGenerationOptions();
options.AddMixinInstance(new ProductRepository());
options.AddMixinInstance(new FileRepository());
var generator = new ProxyGenerator();
var proxy = (Repository)generator.CreateClassProxy(typeof(Repository), options);
(proxy as IProductRepository).Save(new Product());
(proxy as IFileRepository).Save(new File());

Как-то у меня такое чувствоВы также должны быть в состоянии объединить свои интерфейсы и прокси на этом.Что-то в этом роде:

public interface IFullRepository : IProductRepository, IFileRepository
{
}

var proxy = (IFullRepository)generator.???

Я не нашел способа заставить его работать - возможно, спросите ребят из Dynamic Proxy.

0 голосов
/ 10 июня 2011

Как насчет реализации универсального IRepository, который может использовать каждый из классов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...