【问题标题】:How to transition from individual repositories to a service layer?如何从单个存储库过渡到服务层?
【发布时间】:2013-10-15 21:21:10
【问题描述】:

我已经实现了存储库模式。我有我的基本模型类,它们只不过是标准的 C# 类。我有每个模型的存储库类。我有我的DbContext 课程。我使用的是 Ninject,所以除了我的模型之外的所有东西都首先定义为接口。现在,要访问我的数据,我的代码如下所示:

using (var context = m_kernel.Get<IPortalContext>())
{
    var accounts = m_kernel.Get<IAccountRepository>(new ConstructorArgument("context", context));

    foreach (var account in accounts.All())
    {
        Assert.IsNotNull(account);
    }
}

注意:我不确定是否有更好的方式来表示我想将该上下文传递给 IAccountRepository 构造函数,但那是另一次了。

如您所见,我的存储库类都需要一个上下文实例。所以我在相同的上下文中工作,就像一个工作单元一样。

我的问题是,如何为我的业务逻辑引入服务层?现在,我的存储库只有简单的 Get、Delete、All、Insert 方法。我想要一个用于我的特定业务逻辑和验证的服务层。解决这个问题的最佳方法是什么?

乍一看,我可以创建服务类,就像我的 repo 类一样,接受上下文并执行业务逻辑,然后使用 repo 类。这基本上会将存储库隐藏在一起。

这是一个好方法吗?

【问题讨论】:

    标签: c# repository-pattern


    【解决方案1】:

    这就是我使用的方法。这也将允许您使您的存储库通用。这是一个例子:

    Internal class AccountService
    {
        Public Account GetAccount(string firstName)
        {
            var results = Enumerable.Empty<Account>();
    
            try
            {
                 var repository = new Repository<Account>(); // I use and interface here and                    
                                                             // then a factory class. I just
                                                             // was trying to keep it simple.
                 results = repository.FindAll()
                     .Where(a => a.FirstName == firstName)
                     .ToList();
            }
            catch()... etc.
    
            return results;
        }
    }
    
    Public interface IAccountService
    {
        Account GetAccount(string accountNumber);
    }
    

    通过使用此模式,它允许您模拟存储库类的结果并单元测试您的服务类方法,然后因为您使用服务类的接口,您可以在需要时模拟您的服务方法的结果,如果您正在对您的 UI 级别进行单元测试...

    我还成功地为 LinqToSql 和 EntityFramework 创建了通用存储库类,因此我可以更改框架,而无需关心应用程序的其余部分。

    【讨论】:

      猜你喜欢
      • 2011-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 2011-05-21
      • 1970-01-01
      相关资源
      最近更新 更多