Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从单个存储库过渡到服务层?_C#_Repository Pattern - Fatal编程技术网

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

我已经实现了存储库模式。我有我的基本模型类,它们只不过是标准的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);
    }
}
使用(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创建了通用存储库类,因此我可以更改框架,而应用程序的其余部分则不在乎