2015-10-21 3 views
-1

Я работаю над решением MVC, мой слой DAL, который я мог бы решить с помощью классов репозитория, все отлично работает.повторяющийся код в BuisnessLogic MVC

Но в моем BLL слое у меня есть повторяющийся код:

Мои Crud это то же самое, мои поля и 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); 
    } 
} 

Это предполагает Job и JobType как реализовать 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 класс

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 
    {} 
} 

Единственная проблема у меня с этим решением является то, что я не могу использовать поле Entity от моего базового класса в MVC. Поэтому я создал полевую работу. Это связано с привязкой между контроллером и HTML-страницей.

Надеюсь, этот код является большой помощью для других людей.

Смежные вопросы