【问题标题】:How to separate Service layer with Repository如何将服务层与存储库分离
【发布时间】:2015-04-20 09:59:57
【问题描述】:

我想改进我的 ASP.NET MVC 应用程序的体系结构。 在我的控制器中,我使用带有 ViewModel 的服务层。 服务层示例:

 public interface ICashRegisterManager
{
    void CreateCashRegister(CashRegisterTransactionModel model, int? programId);
}

示例控制器:

 public class CashRegisterTransactionController : PersonContextController<CashRegisterTransactionModel, CashRegisterTransactionFilter>
{
    public CashRegisterTransactionController(IPersonContextProvider personContextProvider, ICashRegisterManager cashRegisterManager)
        : base(personContextProvider)
    {
        ExceptionUtil.NotNull(cashRegisterManager, "cashRegisterManager");
        this.cashRegisterManager = cashRegisterManager;
    }

    public override ActionResult Create(DataSourceRequest request, CashRegisterTransactionModel contract)
    {
        cashRegisterManager.CreateCashRegister(contract, contract.ProgramId);
        return base.Create(request, contract);
    }

但在服务层我应该创建 IRepository 的实例,并且每次都将 TContract 映射到 TEntity。

我的想法是在服务层使用中间类,如何制作。

例子:

  public class CashRegisterManager : ICashRegisterManager
  {
      public void CreateCashRegister(CashRegisterTransactionModel model, int? programId)
     {
         var persister = Persistence.GetPersister<CashRegisterTransactionModel>();
         persister.Add(model);
      }
   }

  public interface IPersister<TContrct>
  {
    void Add(TContrct model);
  } 

我不知道如何实现 Add 方法,该方法使用 IRepository。 我想这应该符合 TContract 和 TEnitity(CashRegisterTransactionModel/CashRegisterTransaction) 的命名约定以及如何返回 IPersister 的实例。 我为我的英语道歉。 谢谢你的时间!!!

【问题讨论】:

标签: c# asp.net asp.net-mvc design-patterns repository-pattern


【解决方案1】:

我个人认为创建自己的通用存储库是浪费时间。但是,也许您可​​以尝试这样的事情:

public interface IPersister<T>
{
    void Add(T model);
}

public class Persister<T> : IPersister<T>
{
    protected List<T> data;

    public Persister()
    {
        this.data = new List<T>();
    }

    public void Add(T model)
    {
        this.data.Add(model);
    }
}

【讨论】:

  • 它和你的IPersister有什么不同?我只是为了更有意义而重命名
  • IPersister 与 TContract (ViewModel) 一起使用,而 Repository 与 Entity 对象一起使用。
  • 但它们是通用的?
  • var persister = Persistence.GetPersister();持久性。添加(模型);在 IPersister 的 Add 方法中,我想使用 IRepository
  • 我已重命名为持久性。我想我不明白你的问题是什么
【解决方案2】:

这是 IPersister 的简单实现:

 public class Persister<TContract, TEntity> : IPersister<TContract, TEntity> where TEntity : class,IDeletableEntity
{

    public Persister(IDeletableEntityRepository<TEntity> repository)
    {
        this.repository = repository;
    }

    public void Add(TContract model)
    {
        var entity = Mapper.Map<TContract, TEntity>(model);
        repository.Add(entity);
        repository.SaveChanges();
    }


    public IQueryable<TContract> All<TContract>()
    {
        return repository.All().Where(x => !x.IsDeleted).Project().To<TContract>();
    }

    #region Private Members
    private IDeletableEntityRepository<TEntity> repository;
    #endregion
}

但我不想在创建 IPersister 时使用 TEnitity,因为 mvc 项目没有对数据库实体的引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-23
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    相关资源
    最近更新 更多