如何在 ASP.NET MVC 中组织 DAL

Mut*_*tex 5 c# asp.net-mvc data-access-layer

我正在尝试在 asp.net mvc 项目中组织数据访问层。我已经阅读了很多关于此的不同文章,所以为了解决这个问题,我仍然有一些问题:

  1. 我应该为数据库中的每个实体创建存储库实例还是为所有或一个通用实例创建存储库实例,例如PostRepository可以包括像Post,Comment和 之类的实体Tag

  2. 在控制器中,我必须获取一些数据,将其转换为 ViewModel 并将其传递到视图中。哪里是最好的地方?ServicesController或者别的什么?

  3. 如果是Service。我应该创建多少服务?也适用于每个实体,并在必要时传递到控制器 3 或 4 服务?或者也许像我想在存储库中那样做?(创建一个公共服务,其中包含一定数量的存储库。PostService,存储库如PostRepository,CommentRepositoryTagRepository

SBi*_*are 3

这是我的看法:

我应该为数据库中的每个实体创建存储库实例,还是为所有或一个通用实例创建存储库实例,例如 PostRepository 可以包括帖子、评论和标签等实体?

拥有一个通用存储库将为您省去很多维护麻烦。您可以实现单个通用存储库,例如:

/// <summary>
/// This interface provides an abstraction for accessing a data source.
/// </summary>
public interface IDataContext : IDisposable
{
    IQueryable<T> Query<T>() where T : class;

    T Add<T>(T item) where T : class;

    int Update<T>(T item) where T : class;

    void Delete<T>(T item) where T : class;

    /// <summary>
    /// Allow repositories to control when SaveChanges() is called
    /// </summary>
    int SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

并在单个上下文类中实现上述接口。

有些人还实现单独的特定存储库。

在控制器中,我必须获取一些数据,将其转换为 ViewModel 并将其传递到视图中。执行此操作的最佳地点在哪里?服务、控制器还是其他什么?

在可从 DA、服务和 Web 访问的单独程序集中定义所有模型(DTO 或实体或 POCO)类。服务方法返回模型实例,控制器将它们转换为视图模型(使用 AutoMapper)并传递给视图。同样,在后方法控制器中,首先将VM转换为模型,然后传递到服务层进行持久化或处理。

如果是服务的话。我应该创建多少个服务?如果有必要的话,还可以为每个实体传递到控制器 3 或 4 服务吗?或者也许像我想在存储库中那样做?(创建一个公共服务,其中包含一定数量的存储库。PostService,包含 PostRepository、CommentRepository 和 TagRepository 等存储库)

我强烈建议您非常具体地定义服务。使用单一职责原则来定义您的服务。每个服务都应该提供相关的功能集。例如,AuthService 将验证用户是否不向他们发送电子邮件,即 EmailService 作业。

我建议的模式非常适合不同的服务。例如:

public class DriverSearchService : IDriverSearchService
{
    private readonly IBlobService _blobService;
    private readonly IDataContext _dataContext;

    public DriverSearchService(IDataContext dataContext, IBlobService blobService)
     {
         _blobService = blobService;
        _dataContext = dataContext;
     }

    public void SaveDriveSearch(int searchId)
    {
        // Fetch values from temp store and clear temp store
        var item = context.Query<SearchTempStore>().Single(s => s.SearchId == searchId);

        // Temp object is latest so update the main store
        var mainSearch = context.Query<Search>().Single(s => s.Id == searchId);
        mainSearch.LastExecutedOn = DateTime.UtcNow;
        mainSearch.DataAsBlob = item.DataAsBlob;
        context.Update(mainSearch);
    }
}
Run Code Online (Sandbox Code Playgroud)