-1

私は MVC ソリューションに取り組んでいます。私の DAL レイヤーは、リポジトリ クラスで解決できます。すべてがうまく機能しています。

しかし、私の BLL レイヤーには反復的なコードがあります。

私の Crud は同じですが、フィールドとコンストラクターは異なります。いくつかの追加のメソッドを持つこともできます。

これを適切な方法で解決する方法はありますか?

クラス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


}
4

2 に答える 2

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としています。または、いつでも実行できます。JobTypeIJobJobBasewhere 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() { }
}
于 2015-10-21T18:24:24.487 に答える
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
}

2 つの 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 ページの間のバインディングと関係があります。

このコードが他の人にとって大きな助けになることを願っています。

于 2015-10-23T22:08:48.627 に答える