2015-10-21 10 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页面之间的绑定有关。

希望此代码对其他人有很大的帮助。