2015-04-20 58 views
0

我想改進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的實例。 我爲我的英語道歉。 謝謝你的時間!

+0

您可能會發現這個答案有用 - http://stackoverflow.com/questions/28338868/how-to-organize-dal-in-asp-net-mvc/28339287#28339287 – SBirthare

回答

0

我個人認爲創建自己的通用存儲庫是浪費時間。但是,也許你可以嘗試這樣的事:

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); 
    } 
} 
+0

我已經有一個實施IRepository

+0

它與你的IPersister有什麼不同?我剛剛重命名以便更有意義 – Ewan

+0

當存儲庫與實體對象一起工作時,IPersister使用TContract(ViewModel)。 –

0

這是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項目沒有按」沒有對數據庫實體的引用。