2

ビジネス層にオブジェクトのセットがあり、それらの間に継承構造があり、それらをサポートする一連の DAL オブジェクトがあり、それらがほぼ並列の継承構造を持っているという問題があります。私が遭遇した問題は、DAL タイプが BOL 継承の複数のレベルで理解されなければならないことです。たとえば、基本ビジネス オブジェクトは基本 DAL オブジェクト プロパティにアクセスできる必要がありますが、同じプロパティが後で特定のインスタンスを提供する必要があります。

C# はリターンの共分散をサポートしていないため、オーバーライド宣言でより具体的な型を単純に使用することはできません。また、ジェネリックを使用するには型の具体的な仕様を作成する必要があり、同じリターン共分散の理由でさらに継承が中断されるため、ジェネリックを使用することはできません。これまでに思いついた唯一の解決策は非常に恐ろしいように思えるので、フィードバックや別のアイデアのためにここに投稿したいと思いました.

これは、ジェネリック インターフェイスを定義することで対処できるようIHasDal<TDalType>です。次に、BOLBase : IHasDal<BaseDAL>. これには、BOLBase の .Dal プロパティの実装が必要です。BolChild の場合、 として宣言され、型のプロパティをBOLChild : BOLBase, IHasDal<ChildDAL>指定します。これら 2 つのコマンドは関連がなく、それらが存在するクラスのレベルに固有のものですが、私は typeのプライベート フィールドを持つことでそれらをリンクしました。その後、子プロパティの実装ごとに AS を介してキャストできます。.DalChildDALBOLBaseBaseDAL

理論的には、これは私が探しているものを最小限の問題で提供するはずです。指定したタイプの を実装するオブジェクト、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

ここでの正解は、一方が他方の検索を提供する場合に、このような2つの並列レイヤーを作成することは悪い考えであるように思われます。片側のリターンタイプのジェネリックは、多くのニーズを満たすために使用できますが、ジェネリックに関連する共/逆変の問題のため、ジェネリックを使用する側の機能にはかなり厳しい制限があります。

于 2012-12-18T17:51:33.417 に答える