我的应用程序有很多包含一些常见函数的"部分"页面。
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();
}
由于HasSection
和Finalize
的方法在所有部分中都是相同的,因此我认为我可以将重复的代码重构为抽象类。
抽象类的接口:
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...
}
....
}