2015-10-21 13 views
-1

我正在開發一個MVC解決方案,我的DAL層可以通過Repository類來解決,一切都很好。BuisnessLogic中的重複代碼MVC

但在我BLL層我有重複的代碼:

我是界面污物一樣,我的領域和consructor是不同的。 我也可以有一些額外的方法。

有沒有一種方法可以正確解決這個問題?

1級

public class JobTypeLogic 
{ 
    #region Fields 
    public JobType JobType { get; set; } 
    private UnitOfWork unitOfWork = new UnitOfWork(); 
    public Repository<JobType> JobTypeEngine { get; set; } 
    #endregion 

    #region Constructor 
    public JobTypeLogic() 
    { 
     JobType = new JobType(); 
     JobTypeEngine = unitOfWork.Repository<JobType>(); 
    } 
    #endregion 

    #region CRUD 

    public void Add() 
    { 
     JobTypeEngine.Add(JobType); 
    } 

    public JobType Get(long id) 
    { 
     return JobType = JobTypeEngine.Get(id); 
    } 

    public void Edit() 
    { 
     JobTypeEngine.Edit(JobType); 
    } 

    public void Delete() 
    { 
     JobTypeEngine.Delete(JobType); 
    } 

    public List<JobType> List() 
    { 
     return JobTypeEngine.List.ToList(); 
    } 

    #endregion 

}  

2級

public class JobLogic 
{ 
    #region Fields 
    public Job Job { get; set; }   
    public IEnumerable<SelectListItem> JobTypeList { get; set; } 
    private UnitOfWork unitOfWork = new UnitOfWork(); 
    public Repository<Job> JobEngine; 
    private Repository<JobType> JobTypeEngine; 
    #endregion 

    #region Constructor 
    public JobLogic() 
    { 
     Job = new Job(); 
     JobEngine = unitOfWork.Repository<Job>(); 
     JobTypeEngine = unitOfWork.Repository<JobType>(); 
     JobTypeList = GetJobTypeList(); 
    } 
    #endregion 

    #region CRUD 

    public void Add() 
    { 
     JobEngine.Add(Job); 
    } 

    public Job Get(long id) 
    { 
     return Job = JobEngine.Get(id); 
    } 

    public void Edit() 
    { 
     JobEngine.Edit(Job); 
    } 

    public void Delete() 
    { 
     JobEngine.Delete(Job); 
    } 

    public List<Job> List() 
    { 
     return JobEngine.List.ToList(); 
    } 

    #endregion 

    #region Methode 

    private IEnumerable<SelectListItem> GetJobTypeList() 
    { 
     JobTypeEngine = unitOfWork.Repository<JobType>(); 
     var jobs = JobTypeEngine.List 
        .Select(x => 
          new SelectListItem 
          { 
           Value = x.ID.ToString(), 
           Text = x.Name 
          }); 

     return new SelectList(jobs, "Value", "Text"); 
    } 

    #endregion 


} 
+0

?就像你說的那樣,使用一個存儲庫模式並將crud邏輯放在那裏,而不是類 – Ewan

+0

使用抽象基類並傳遞JobEngine作爲依賴關係。 – XtremeBytes

+0

喜歡你的倉庫和使用泛型。 – Jasen

回答

1

您可以創建一個通用的基類

public class GenericJobLogic<T> where T : IJob 
{ 
    private Repository<T> engine; 

    public GenericJobLogic() 
    { 
     this.engine = unitOfWork.Repository<T>(); 
    } 

    public virtual T Get(long id) 
    { 
     return this.engine.Get(id); 
    } 
} 

這是假設JobJobType都實現IJob或其他一些基礎類JobBase 。或者你總是可以做where T : class

使用變得

var jobBll = new GenericJobLogic<Job>(); 
Job job = jobBll.Get(1); 

你仍然可以覆蓋你的基地BLL類。然後覆蓋或擴展只有必要的部分,而不是寫一個完整的實現。

public class JobLogic : GenericJobLogic<Job> 
{ 
    public override Job Get(long id) { } 
    public IEnumerable<JobType> GetJobTypeList() { } 
} 
+0

感謝您的信息。我明天早上會試試 –

0

感謝您的回覆。 我通過創建一個通用基類並從該類繼承來解決了這個問題。

基類

public class GenericLogic<T> where T : BaseEntity 
{ 
    private Repository<T> engine; 
    private UnitOfWork unitOfWork = new UnitOfWork(); 
    public T Entity; 

    public GenericLogic() 
    { 
     this.engine = unitOfWork.Repository<T>(); 
    }   
    #region CRUD 

    public void Add() 
    { 
     engine.Add(Entity); 
    } 
    public T Get(long id) 
    {} 
    public void Edit() 
    {} 
    public void Delete() 
    {} 
    public List<T> List() 
    {} 
    #endregion 
} 

兩個BLL類(和BLL的其餘部分)變亮,而不是重複的。

BLL類

public class JobLogic : GenericLogic<Job> 
{ 
    #region Fields 
    public Job Job { get; set; }  
    public IEnumerable<SelectListItem> JobTypeList { get; set; } 
    #endregion 

    #region Constructor 
    public JobLogic() 
    { 
     Job = new Job(); 
     JobTypeList = GetJobTypeList(); 
    } 
    #endregion 

    #region Methode 
    private IEnumerable<SelectListItem> GetJobTypeList() 
    { 
     UnitOfWork unitOfWork = new UnitOfWork(); 
     Repository<JobType> jobTypeEngine = unitOfWork.Repository<JobType>(); 
     var jobs = jobTypeEngine.List 
        .Select(x => 
          new SelectListItem 
          { 
           Value = x.ID.ToString(), 
           Text = x.Name 
          }); 
     return new SelectList(jobs, "Value", "Text"); 
    } 
    #endregion 
} 

DAL類是

public class Repository<T> where T : BaseEntity 
{ 
    private readonly FlowContext context; 
    private IDbSet<T> entities; 
    string errorMessage = string.Empty; 

    public Repository(FlowContext context) 
    { 
     this.context = context; 
    } 

    public T Get(object id) 
    {} 

    public void Add(T entity) 
    {} 

    public void Edit(T entity) 
    {} 

    public void Delete(T entity) 
    {} 

    private IDbSet<T> Entities 
    {} 
} 

我有這種解決方案的唯一的問題是我無法從我的MVC基類中使用實體領域。所以我創建了一個Field Job。這與控制器和HTML頁面之間的綁定有關。

希望此代碼對其他人有很大的幫助。