我已经实现了存储库模式。我有我的基础模型类,它们只不过是标准的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类。这基本上可以将存储库隐藏在一起。
这是一个好方法吗?
答案 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创建了通用存储库类,因此我可以更改框架,而应用程序的其余部分并不关心。