C# 如何从单个存储库过渡到服务层?
我已经实现了存储库模式。我有我的基本模型类,它们只不过是标准的C#类。我已经为每个模型设置了存储库类。我有了我的C# 如何从单个存储库过渡到服务层?,c#,repository-pattern,C#,Repository Pattern,我已经实现了存储库模式。我有我的基本模型类,它们只不过是标准的C#类。我已经为每个模型设置了存储库类。我有了我的DbContext类。我使用的是Ninject,所以除了我的模型之外,所有东西都首先定义为接口。现在,要访问我的数据,我的代码如下所示: using (var context = m_kernel.Get<IPortalContext>()) { var accounts = m_kernel.Get<IAccountRepository>(new Co
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);
}
}
使用(var context=m_kernel.Get())
{
var accounts=m_kernel.Get(新构造函数参数(“context”,context));
foreach(accounts.All()中的var帐户)
{
Assert.IsNotNull(帐户);
}
}
注意:我不确定是否有更好的方法来表示我希望将该上下文传递到IAccountRepository构造函数中,但这是另一个时间
如您所见,我的存储库类都需要一个上下文实例。这就是我在同样的背景下工作的原因,就像一个工作单元
我的问题是,如何为我的业务逻辑引入服务层?现在,我的存储库只有简单的Get、Delete、All和Insert方法。我想要一个服务层,用于我的特定业务逻辑和验证。最好的办法是什么
乍一看,我可以创建服务类,很像我的repo类,它们接受上下文并执行业务逻辑,然后使用repo类。这基本上将所有存储库都隐藏在一起
这是一个好方法吗?这就是我使用的方法。这也将允许您使您的存储库通用化。以下是一个例子:
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);
}
内部类AccountService
{
公共帐户GetAccount(字符串名)
{
var results=Enumerable.Empty();
尝试
{
var repository=new repository();//我在这里和
//然后是工厂班,我只是
//我试图保持简单。
结果=repository.FindAll()
.Where(a=>a.FirstName==FirstName)
.ToList();
}
catch()…等。
返回结果;
}
}
公共接口服务
{
Account GetAccount(字符串accountNumber);
}
通过使用此模式,您可以模拟存储库类的结果并对服务类方法进行单元测试,然后,由于您使用的是服务类的接口,因此如果您正在对UI级别进行单元测试,则可以在需要时模拟服务方法的结果
此外,我还成功地为LinqToSql和EntityFramework创建了通用存储库类,因此我可以更改框架,而应用程序的其余部分则不在乎。这就是我使用的方法。这也将允许您使您的存储库通用化。以下是一个例子:
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);
}
内部类AccountService
{
公共帐户GetAccount(字符串名)
{
var results=Enumerable.Empty();
尝试
{
var repository=new repository();//我在这里和
//然后是工厂班,我只是
//我试图保持简单。
结果=repository.FindAll()
.Where(a=>a.FirstName==FirstName)
.ToList();
}
catch()…等。
返回结果;
}
}
公共接口服务
{
Account GetAccount(字符串accountNumber);
}
通过使用此模式,您可以模拟存储库类的结果并对服务类方法进行单元测试,然后,由于您使用的是服务类的接口,因此如果您正在对UI级别进行单元测试,则可以在需要时模拟服务方法的结果
此外,我还成功地为LinqToSql和EntityFramework创建了通用存储库类,因此我可以更改框架,而应用程序的其余部分则不在乎