如何/是否可以将带有注入接口的重复代码重构为抽象类



我的应用程序有很多包含一些常见函数的"部分"页面。

public bool HasSection(Guid id)
{
    var entity = _repository.Find(id);
    var hasSection = entity != null;
    return hasSection;
}
public void Finalize(Guid id)
{
    _repository.UpdateStatus(id, SectionStatus.Completed);
    _repository.Save();
}

上面的_repository是从IRepository<T>注入的。

private readonly IRepository<SomeDomainModel> _repository;
public SomeModelWorkerServices(IRepository<SomeDomainModel> repository)
{
    _repository = repository;
}
public void Update(SomeInputModel model)
{
    var entity = Mapper.Map<SomeDomainModel>(model);
    _repository.Update(entity);
    _repository.Save();
}

由于HasSectionFinalize的方法在所有部分中都是相同的,因此我认为我可以将重复的代码重构为抽象类。

抽象类的接口:

public interface ISectionWorkerServices<T>
{
    bool HasSection(Guid id);
    void Finalize(Guid id, SectionStatus status);
    ... some other methods to be overriden in each inherated class.
    void Update(T model);
}

其中 T 应该是我所有部分输入模型的基本模型。

在实现中,我发现很难注入_repository.

public abstract class SectionWorkerServices<T> : ISectionWorkerServices<T> where T :SectionInputModelBase
{
    private readonly IRepository<TDomainModel> _repository; // a T for its domain model
    protected SectionWorkerServices(IRepository<TDomainModel> repository)
    {
        _repository = repository;
    }
    public bool HasSection(Guid id)
    {
        var entity = _repository.Find(id);
        var hasSection = entity != null;
        if (hasSection) _repository.Detach(entity);
        return hasSection;
    }
    ....
    public abstract void Update(T  model, SectionStatus status);
}

SectionWorkerServices中,我想使用 T 作为每个实现的InputModel。但是在这个SectionWorkerServices的构造函数中,我需要注入T相应的域模型存储库。

我怎样才能做到这一点?

public abstract class SectionWorkerServices<T> : ISectionWorkerServices<T> where T :SectionInputModelBase
{
    private readonly IRepository<T> _repository; // a T for its domain model
    protected SectionWorkerServices()
    {
        _repository = CreateRepository();
    }
    public bool HasSection(Guid id)
    {
        var entity = _repository.Find(id);
        var hasSection = entity != null;
        if (hasSection) _repository.Detach(entity);
        return hasSection;
    }
    ....
    public abstract void Update(T  model, SectionStatus status);
    //Factory Method
    protected abstract IRepository<T> CreateRepository();
}

或者使用 2 种泛型类型:

public abstract class SectionWorkerServices<T,TDomainModel> : ISectionWorkerServices<T> where T :SectionInputModelBase
{
    private readonly IRepository<TDomainModel> _repository;
    protected SectionWorkerServices()
    {
        _repository = CreateRepository();
    }
    public bool HasSection(Guid id)
    {
        var entity = _repository.Find(id);
        var hasSection = entity != null;
        if (hasSection) _repository.Detach(entity);
        return hasSection;
    }
    ....
    public abstract void Update(T  model, SectionStatus status);
    //Factory Method
    protected abstract IRepository<TDomainModel> CreateRepository();
}

编辑

public abstract class SectionWorkerServices<T> : ISectionWorkerServices<T> where T :SectionInputModelBase
{
    protected SectionWorkerServices()
    {
    }
    public bool HasSection(Guid id)
    {
        var entity = Repository.Find(id);
        var hasSection = entity != null;
        if (hasSection) Repository.Detach(entity);
        return hasSection;
    }
    ....
    public abstract void Update(T  model, SectionStatus status);
    protected abstract IRepository<T> Repository { get; }
}

在具体服务中

public ConcreteSectionWorkerService : SectionWorker<SomeDomainModel>
{
    protected override IRepository<SomeDomainModel> Repository { get; private set; }
    public ConcreteSectionWorkerService()
    {
        Repository = new WhatEverRepository(); //carefull you have to set this...
    }
    ....
}

最新更新