справка по репозиторию - PullRequest
       48

справка по репозиторию

0 голосов
/ 17 декабря 2010

Я пытаюсь создать класс репозитория для каждой таблицы. Например, у меня есть TableA, TableB и TableC. TableB и TableC имеют внешний ключ для TableA. Я создал интерфейс для TableA, TableB и TableC с SaveData () и ListData (). У меня есть форма MVC, которая вставляет данные в эти таблицы. При реализации этих методов интерфейса я должен создать отдельный класс для каждого интерфейса? Пожалуйста, дайте мне, если я делаю правильно. Я ценю любую помощь.

Public interface ITableA
{
    void SaveData(TableAEntity); 
    List<TableAEntity> ListData();
}  

Public interface ITableB
{
    void SaveData(TableBEntity); 
    List<TableBEntity> ListData();
}  

Public class ImplementTableA_TableB: ITableA, ITableB
{

    public void SaveData(TableAEntity)
    {

    }
    public void SaveData(TableBEntity)
    {

    }
}

Ответы [ 3 ]

2 голосов
/ 17 декабря 2010

Это зависит.Фактически, при использовании шаблона репозитория следует учитывать агрегатов , а не таблиц.

Обычно каждый определяет репозиторий на агрегат в домене.То есть: у нас нет хранилища для каждой сущности!Если мы посмотрим на простую систему ввода заказов, сущность Order может быть корнем агрегата Order.Таким образом, у нас будет Репозиторий заказов.

Так что, да, в зависимости от вашей доменной модели у вас может получиться только один класс репозитория, который отвечает за работу с двумя или более объектами (или таблицами).Но так как я не знаю ни о какой особенности вашей доменной модели, я не смогу вам сказать, так ли это здесь.

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

1 голос
/ 12 октября 2011

Самый простой способ сделать это:

Шаг 1. Создайте модель для каждой сущности, которая вам нужна.

Например.

public class BankAccount
{
    public virtual int ID { get; set; }

    public virtual string BankAccNo { get; set; }

    public virtual int BankCode { get; set; }
}

Шаг 2:Создайте сопоставление с таблицей базы данных, используя Automapper

Например.

public class BankAccountMap : ClassMap<BankAccount>
{
    public BankAccountMap()
    {
        Id(x => x.ID);
        Map(x => x.BankAccNo);
        Map(x => x.BankCode);

        Table("dbo.BankAccount");
    }
}

Шаг 3. Создайте репозиторий, который будет выполнять все операции с базой данных.

    public class BankAccountRepository : BaseRepository<BankAccount>, IRepository<BankAccount>
       {
           public BankAccountRepository(ISessionFactoryCreator sessionFactoryCreator) : base(sessionFactoryCreator)
           {
               _sessionFactory = sessionFactoryCreator.CreateSessionFactory();
           }

           public BankAccount GetByBankCode(int code)
           {
                using (var session = _sessionFactory.OpenSession())
                {
                     return session.Linq<BankAccount>().Where(o => o.BankCode == code).ToList<BankAccount>().FirstOrDefault();
                }
           }
       }
1 голос
/ 17 декабря 2010

Вот хорошая статья, которая объясняет шаблон хранилища: http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/10/08/the-repository-pattern.aspx

...