【问题标题】:repetitive code in BuisnessLogic MVCBuisnessLogic MVC 中的重复代码
【发布时间】:2016-01-20 19:45:41
【问题描述】:

我正在开发 MVC 解决方案,我的 DAL 层可以使用存储库类来解决,一切都很好。

但在我的 BLL 层中,我有重复的代码:

我的 Crud 是一样的,我的领域和建设者是不同的。 我还可以有一些额外的方法。

有没有办法以正确的方式解决这个问题?

第一类

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


}

【问题讨论】:

  • ?就像你说的那样,使用存储库模式并将 crud 逻辑放在那里而不是 Classes
  • 使用抽象基类并将 JobEngine 作为依赖项传递。
  • 喜欢你的存储库并使用泛型。
  • 你的逻辑类看起来更像是“控制器”,但是 BLL 层。我没有在其中看到任何 BL。
  • 这可能更适合Code Review

标签: c# asp.net-mvc data-access-layer bll


【解决方案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() { }
}

【讨论】:

  • 感谢您的信息。我明天早上试试
【解决方案2】:

感谢您的回复。 我通过创建一个通用基类并从该类继承来解决了这个问题。

基类

 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 中基类中的 Entity 字段。因此,我创建了一个现场作业。这与控制器和 HTML 页面之间的绑定有关。

希望这段代码对其他人有很大帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多