如何从单个存储库转换到服务层?

时间:2013-10-15 21:21:10

标签: c# repository-pattern

我已经实现了存储库模式。我有我的基础模型类,它们只不过是标准的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类。这基本上可以将存储库隐藏在一起。

这是一个好方法吗?

1 个答案:

答案 0 :(得分: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);
}

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

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