我有一个问题,我在业务层中有一组对象,它们之间有一个继承结构,我还有一组支持它们的 DAL 对象,它们具有大致平行的继承结构。我遇到的问题是必须在 BOL 继承的多个级别上理解 DAL 类型,例如,基础业务对象必须能够访问基础 DAL 对象属性,但是同一属性必须稍后提供特定实例。
由于 C# 不支持返回协方差,我不能简单地在覆盖声明中使用更具体的类型。我也无法使用泛型,因为我必须对类型进行具体规范才能使用它,并且由于相同的返回协方差原因而破坏了进一步的继承。到目前为止,我能够提出的唯一解决方案似乎非常可怕,所以我想在这里发布它以获得反馈或替代想法。
看来这可以通过定义一个通用接口来解决IHasDal<TDalType>
。然后我可以指定BOLBase : IHasDal<BaseDAL>
. 这需要在 BOLBase 上实现 .Dal 属性。对于 BolChild,它被声明为BOLChild : BOLBase, IHasDal<ChildDAL>
,然后指定一个.Dal
类型为 的属性ChildDAL
。虽然这两个命令与它们所在的类的级别无关且特定于它们,但我通过在BOLBase
type中拥有一个私有字段来链接它们BaseDAL
。然后我可以通过 AS 为每个子属性实现进行转换。
从理论上讲,这似乎应该给我我正在寻找的最小问题。它将可用于实现IHasDal
我指定的任何类型的对象或任何给定的BOLBase
派生类。它仍然感觉很难看,因为它似乎有效地依赖方法隐藏,但我想不出更好的方法。
public interface IHasDal<TDalType>
where TDalType : BaseDal
{
TDalType Dal { get; set; }
}
public class BaseDal
{
}
public class BaseEntity : IHasDal<BaseDal>
{
protected BaseDal _dal;
public BaseDal Dal
{
get
{
return (BaseDal)_dal;
}
set
{
_dal = value;
}
}
}
public class ChildDal : BaseDal
{
}
public class ChildEntity : BaseEntity, IHasDal<ChildDal>
{
public ChildDal Dal
{
get
{
return this._dal as ChildDal;
}
set
{
this._dal = value;
}
}
}