我正在寻找如何将一个带有类型鉴别器的DTO类映射到多个域类的建议。
public class FooData
{
public Guid Id { get; set; }
public string Name { get; set; }
public string TypeDiscrim { get; set; }
}
public class FooDataRepository
{
public List<FooData> GetAll() { /* select * from foo, basically */ }
}
我有一个基域对象,它的构造函数依赖于一个具有泛型参数的存储库:
public interface IFooDomain {}
public class FooDomainBase<B1> : IFooDomain where B1 : BarBase
{
protected IBarRepository<B1> _barRepository;
public FooDomainBase(FooData data, IBarRepository<B1> barRepository)
{
Id = data.Id;
Name = data.Name;
_barRepository = barRepository;
}
public virtual void Behavior1()
{
B1 thingToDoStuffWith = _barRepository.GetBar();
/* do stuff */
}
public Guid Id { get; set; }
public string Name { get; set; }
}
public class BarBase {}
public interface IBarRepository<B1> where B1 : BarBase
{
B1 GetBar();
}
然后,我有一个来自基本域对象的示例继承器:
// There will be several of these
public class SuperFooDomain1 : FooDomainBase<SuperBar>
{
public SuperFooDomain1(FooData data, IBarRepository<SuperBar> barRepository) : base(data, barRepository)
{ }
public override void Behavior1() { /* do something different than FooDomainBase */ }
}
public class SuperBar : BarBase { }
现在关键是:我有一个类将使用IFooDomain列表,它从存储库中获取。(由于FooDomainBase中的type参数,IFooDomain是必需的。)
// The FooManager class (not pictured) will use this to get all the
public class FooRepository
{
private FooDataRepository _datarepository;
public FooRepository(FooDataRepository dataRepository)
{
_datarepository = dataRepository;
}
public List<IFooDomain> GetAll()
{
foreach (var data in _datarepository.GetAll())
{
// Convert FooData into appropriate FooDomainBase inheritor
// depending on value of FooData.TypeDiscrim
}
}
}
我能用DI框架完成上面评论中的行为吗?我猜我必须作为服务定位器模式返回一个实例化的
FooDomainBase
继承器,但我还需要
IBarRepository<SuperBar>
断然的。
什么样的框架可以处理这种事情?如果不是开箱即用,我需要扩展什么?
我也对对象层次结构的批评持开放态度,因为这可能指向了上述设计中的一个缺陷。