2

我有一个问题,我在业务层中有一组对象,它们之间有一个继承结构,我还有一组支持它们的 DAL 对象,它们具有大致平行的继承结构。我遇到的问题是必须在 BOL 继承的多个级别上理解 DAL 类型,例如,基础业务对象必须能够访问基础 DAL 对象属性,但是同一属性必须稍后提供特定实例。

由于 C# 不支持返回协方差,我不能简单地在覆盖声明中使用更具体的类型。我也无法使用泛型,因为我必须对类型进行具体规范才能使用它,并且由于相同的返回协方差原因而破坏了进一步的继承。到目前为止,我能够提出的唯一解决方案似乎非常可怕,所以我想在这里发布它以获得反馈或替代想法。

看来这可以通过定义一个通用接口来解决IHasDal<TDalType>。然后我可以指定BOLBase : IHasDal<BaseDAL>. 这需要在 BOLBase 上实现 .Dal 属性。对于 BolChild,它被声明为BOLChild : BOLBase, IHasDal<ChildDAL>,然后指定一个.Dal类型为 的属性ChildDAL。虽然这两个命令与它们所在的类的级别无关且特定于它们,但我通过在BOLBasetype中拥有一个私有字段来链接它们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;
        }
    }
}
4

1 回答 1

0

这里的正确答案似乎是,像这样有两个平行层是一个坏主意,其中一个为另一个提供检索。一方面的返回类型上的泛型可用于满足许多需求,但由于与泛型相关的共/逆变问题,使用泛型的一侧的功能存在一些非常严重的限制。

于 2012-12-18T17:51:33.417 回答