Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.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# 基于Raven数据库的数据访问体系结构_C#_Architecture_Data Access Layer_Ravendb - Fatal编程技术网

C# 基于Raven数据库的数据访问体系结构

C# 基于Raven数据库的数据访问体系结构,c#,architecture,data-access-layer,ravendb,C#,Architecture,Data Access Layer,Ravendb,我可以在Raven DB中使用哪些数据访问架构 基本上,我希望通过接口分离持久性,所以我不向上层公开下划线存储。也就是说,我不希望我的域看到来自Raven DB的IDocumentStore或IDocumentSession 我已经实现了通用存储库模式,这似乎是可行的。然而,我不确定这实际上是正确的方法。也许我应该去指挥部或者别的什么地方 你的想法是什么?你想通过它实现什么 您不能构建一个同时使用RDBMS和DocDB的应用程序,至少不能高效地使用。您必须自己决定要使用哪个数据库,然后一直使用它

我可以在Raven DB中使用哪些数据访问架构

基本上,我希望通过接口分离持久性,所以我不向上层公开下划线存储。也就是说,我不希望我的域看到来自Raven DB的IDocumentStore或IDocumentSession

我已经实现了通用存储库模式,这似乎是可行的。然而,我不确定这实际上是正确的方法。也许我应该去指挥部或者别的什么地方


你的想法是什么?

你想通过它实现什么


您不能构建一个同时使用RDBMS和DocDB的应用程序,至少不能高效地使用。您必须自己决定要使用哪个数据库,然后一直使用它。如果您决定使用RDMBS,您可以使用NHibernate,然后再使用一次-不需要任何其他抽象层。

就我个人而言,我对命令模式没有太多经验。我看到它被用在汽车上

对于我自己,我将尝试使用以下方法:-

  • 存储库模式(如您所做)
  • 使用StructureMap进行依赖项注入
  • 模拟测试的最小起订量
  • 用于隔离业务逻辑的服务层(不确定此处的模式..或者即使这是一种模式)
因此,当我希望从RavenDB(持久性源)获取任何数据时,我将使用服务,然后服务将调用相应的存储库。这样,我不会向应用程序公开存储库,也不会使存储库非常繁重或复杂->它基本上是FindAll/Save/Delete

例如

publicsomecontroller(IUserService用户服务、ilogingservice日志服务)
{
UserService=UserService;
LoggingService=LoggingService;
}
公共行动方法索引()
{
//查找所有活动用户,第1页和第15页记录。
var users=UserService.FindWithIsActive(1,15);
返回视图(新索引模型(用户));
}
公共类UserService:IUserService
{
公共用户服务(IGenericRepository userRepository,
ILoggingService日志服务)
{
Repository=userRepository;
LoggingService=LoggingService;
}
公共IEnumberable FindWithIsActive(整版页,整版计数)
{
//注意:在本例中,Repository.Find()返回IQueryable。
//如果它是一个RDMBS,可以将其视为一个SELECT*FROM用户表。
返回Repository.Find()
.WithIsActive()
.跳过(第页)
.记(数)
.ToList();
}
}
这是一个非常简单且精心设计的示例,没有错误/验证检查、try/catch等…它是伪代码..但您可以看到服务是如何丰富的,而存储库(至少对我来说)是简单或更轻的。然后我只通过服务公开任何数据


这就是我现在使用
.NET
实体框架所做的事情,而我现在距离使用
RavenDb
(呜呜!)

谢谢你的回答。我想做的是保持敏锐的洞察力和无知。这就是为什么我想使用额外的抽象级别。你的意思是你想实现持久性无知。这正是我写第二段的原因。如果你使用文档数据库,你就不能有效地允许使用RDBMS——你将失去所有美好的spots文档数据库有。但我将绑定到RavenDB中定义的接口,我不想有特定的接口,这可能吗?嗯,你确实需要会话和数据存储,不是吗?不,我不想让我的域知道有会话和存储,事实上没有特定于持久性的。我希望我的域与sto分离通过Raven DB和其他nosqldb的具体实现在界面上狂怒。答案很好!我会再等几天,看看是否有其他人有不同的看法。就我个人而言,我使用相同的技术和方法,所以你的答案似乎是最接近的。
public SomeController(IUserService userService, ILoggingService loggingService)
{
    UserService = userService;
    LoggingService = loggingService;
}

public ActionMethod Index()
{
   // Find all active users, page 1 and 15 records.
    var users = UserService.FindWithIsActive(1, 15);         
    return View(new IndexViewModel(users));
}

public class UserService : IUserService
{
    public UserService(IGenericReposistory<User> userRepository, 
                       ILoggingService loggingService)
    {
        Repository = userRepository;
        LoggingService = loggingService;
    }

    public IEnumberable<User> FindWithIsActive(int page, int count)
    {
        // Note: Repository.Find() returns an IQueryable<User> in this case.
        //       Think of it as a SELECT * FROM User table, if it was an RDMBS.
        return Repository.Find() 
            .WithIsActive()
            .Skip(page)
            .Take(count)
            .ToList();
    }
}