Шаблон репозитория с .NET 1.1 - PullRequest
5 голосов
/ 08 июля 2009

Каков типичный подход к использованию шаблона репозитория с .NET 1.1 (C #)?

Я ищу что-то вроде этого вопроса о переполнении стека , за исключением того, что в .NET 1.1 у меня нет обобщений, поэтому я просто смотрю, возможно ли это ( Я уверен, что это так), и как это обычно делается.

Ответы [ 2 ]

1 голос
/ 08 июля 2009

Это очень возможно, но вы либо не должны использовать общий интерфейс, либо выполнять много кастинга. Использование интерфейса ...

public interface IRepository
{
    public object Get(int id); // or object id
    public void Save(object obj);
}

public class CustomerRepository : IRepository
{
    public object Get(int id) { // implementation }
    public void Save(object obj) { // implementation }
}

Это работает нормально, но вызывающий код должен приводить объекты к правильному типу, а методы в конкретных реализациях должны проверять тип и генерировать исключения. Прямое приведение требует исключений во время выполнения, поэтому я бы избегал такого подхода.

Подход, который я бы порекомендовал, заключается в том, чтобы в ваших хранилищах не было общего интерфейса. Вместо этого пусть они реализуют общеизвестные методы по соглашению.

public class CustomerRepository
{
    public Customer Get(int id) { // implementation }
    public void Save(Customer entity) { // implementation }
}

public class EmployeeRepository
{
    public Employee Get(int id) { // implementation }
    public void Save(Employee entity) { // implementation }
}

Отредактировано, чтобы добавить: я перечитала связанный ответ. Последний полный абзац теряет меня, но я могу немного расширить использование DI. В большинстве случаев не имеет смысла использовать DI для внедрения «общего» (в данном случае значения, полученного из общего интерфейса) хранилища. В дополнение к обычным методам, хранилище будет иметь методы, специфичные для сущностей, например GetCustomersWithPastDueAccounts. Вы можете определить ICustomerRepository с помощью этого метода и сделать так, чтобы ваш CustomerRepository реализовал это. Затем вы можете использовать внедрение зависимостей для внедрения CustomerRepository во время выполнения. В этом нет ничего плохого, но, по моему опыту, достаточно редко, чтобы у вас было несколько реализаций репозитория, поэтому в этом нет особого смысла.

0 голосов
/ 08 июля 2009

, если я что-то не понял, в принятом ответе на вопрос, который вы указали, не используются дженерики. Он определяет Интерфейс и использует термин «универсальный», чтобы обозначить, что Интерфейс не привязан напрямую к какой-либо конкретной таблице в модели.

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