存储库模式帮助

发布于 2024-10-08 03:01:58 字数 621 浏览 2 评论 0原文

我正在尝试为每个表创建一个存储库类。例如我有 TableA、TableB 和 TableC。 TableB 和 TableC 具有 TableA 的外键。我使用 SaveData() 和 ListData() 创建了 TableA、TableB 和 TableC 的接口。我有 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)
    {

    }
}

I am trying to create a repository class for each table. For example I have TableA, TableB and TableC. TableB and TableC has Foreign key to TableA. I created an interface for TableA, TableB and TableC with SaveData() and ListData(). I have MVC form which inserts the data into these tables. When implementing these interface methods do I have to create a seperate class for each interface? Please let me if I am doing right. I appreciate any help.

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)
    {

    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

独行侠 2024-10-15 03:01:58

这取决于。事实上,在使用存储库模式时,应该考虑聚合,而不是表格。

通常为每个定义一个存储库
域中的聚合。那就是:我们
每个实体没有存储库!如果
我们看一下简单的订单输入
系统实体 Order 可能是
订单聚合的根。因此我们
将有一个订单存储库。

所以,是的,根据您的域模型,您最终可能只有一个存储库类负责处理两个或多个实体(或表)。但由于我不知道您的域模型的任何特殊性,因此我无法告诉您这里是否属于这种情况。

请查看 此处。这是 NHibernate FAQ 的链接,但即使您没有使用该 ORM,也有相关信息。

It depends. In fact, when using the repository pattern one should think about aggregates, not tables.

Usually one defines a repository per
aggregate in the domain. That is: we
don't have a repository per entity! If
we have a look at a simple order entry
system the entity Order might be the
root of a Order aggregate. Thus we
will have an Order Repository.

So, yes, depending of your domain model you may end up having just one repository class that is responsible for dealing with two or more entities (or tables). But since I do not know about any particularity of your domain model, I won't be able to tell you if that's the case here.

Please, take a look at here. This is a link to the NHibernate FAQ, but there is relevant information even if you are not using that ORM.

吻风 2024-10-15 03:01:58

最简单的方法是:

第 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();
                }
           }
       }

The easiest way you can do this is:

Step 1: Create a model for every entity you need.

Eg.

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

    public virtual string BankAccNo { get; set; }

    public virtual int BankCode { get; set; }
}

Step 2: Create a Mapping to the database table, using Automapper

Eg.

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

        Table("dbo.BankAccount");
    }
}

Step 3: Create a repository that would do all your database operations.

    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();
                }
           }
       }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文