使用Raven DB的数据访问体系结构

时间:2011-05-06 09:26:54

标签: c# architecture data-access-layer ravendb

我可以使用哪些数据访问体系结构与Raven DB一起使用?

基本上,我想通过接口分离持久性,因此我不会将下划线存储暴露给上层。即我不希望我的域看到来自Raven DB的 IDocumentStore IDocumentSession

我已经实现了通用存储库模式,这似乎有效。但是,我不确定这是否是正确的方法。也许我会去命令查询隔离或其他什么?

你有什么想法?

2 个答案:

答案 0 :(得分:6)

就个人而言,我对命令模式并不熟悉。我看到它在Rob Ashton's excellent tutorial中使用。

对于我自己,我将尝试使用以下内容: -

  • 存储库模式(正如您所做)
  • 使用StructureMap进行依赖注入
  • 模拟测试的Moq
  • 用于隔离业务逻辑的服务层(不确定此处的模式......或者即使这是一种模式。

因此,当我希望从RavenDB(持久性源)获取任何数据时,我将使用Services,然后将调用相应的存储库。这样,我不会将存储库暴露给应用程序,也不会使存储库非常繁重或复杂 - >它基本上是一个FindAll / Save / Delete。

例如

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();
    }
}

所以这是一个非常简单和人为的例子,没有错误/验证检查,尝试/捕获等等......它是伪代码..但是你可以看到服务是如何而存储库(假设至少对我而言)简单更轻。然后我只通过服务公开任何数据。

这就是我现在使用.NETEntity Framework所做的事情,而我距离RavenDb只有几个小时的时间(WOOT!)

答案 1 :(得分:2)

你想要实现的目标是什么?

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