1

私は自分のオブジェクトを保持するためのクラス ライブラリを持っているので:

xxxCommon\Objects\Customer.cs

    public class Customer
    {
        public string url { get; set; }
        public List<Telephone> telephones { get; set; }
    }

xxxData\DC\CustomerDC.cs (データ コンポーネント)

  • このクラスは多くのプロシージャを呼び出し、xxxCommon\Objects のオブジェクトを返します

私の主な問題は循環参照です。「遅延」ロードを行うには、xxxData\DC の関数に電話属性の取得を設定する必要があります。これを回避するにはどうすればよいですか?

4

3 に答える 3

3

コールバック メソッドを使用して、循環参照を回避できます。

たとえば、クラス ActiveRecordSQL<T> には、エンティティを作成するための既定のメソッドがありますが、上書きすることができます。

private Func<T> GetNewEntity;

protected ActiveRecordSQL() // constructor
{
    GetNewEntity = DefaultGetNewEntity;
}

protected Result<T> GetWithCustomEntity(SqlCommand cmd, Func<T> GetCustomEntity)
{
    GetNewEntity = GetCustomEntity;
    return Get(cmd);
}

private T DefaultGetNewEntity()
{
    return new T();
}

protected T Populate(DataRow row, T existing)
{
    T entity = existing ?? GetNewEntity();
    entity.Populate(row);
    return entity;
}

カスタム関数を渡す必要があるクラスは、ラムダ式を使用するか、適切なシグネチャを使用して独自の関数への参照を渡すことができます。

        ReferrerInfo = dc.Referrers.GetCustomReferrer(referrerID, () => new ReferrerFacade()).Data as ReferrerFacade;

「GetCustomReferrer」は、メソッドを単に「GetWithCustomEntity」に渡す中間メソッドを呼び出します。「ReferrerFacade」はエンティティをサブクラス化し、別のプロジェクトに属します。コールバック メソッドを渡すと、既存の参照全体で「逆方向」の呼び出しが可能になります。

于 2011-05-02T20:33:45.627 に答える
2

循環依存関係を解決する 1 つの方法は、2 つのアセンブリの間にレイヤーを配置することです。

このシナリオではなく。

組立モデル:

public class Customer{ 
    //...
}

組立データ:

public class CustomerDAO{
    public Customer LoadCustomer(int id){
         return new Customer(id,...);
    }
}

Model アセンブリが Data アセンブリを参照し、Data が Model に戻って Customer をインスタンス化できない場合。

代わりに持つことができます。

組立モデル:

public class CustomerModel:Customer{}
public class ModelFactoryImp:ModelFactory{
    public Customer CreateCustomer(int id,//...customer params){
        return new CustomerModel(...);
    }
}

アセンブリ モデル インターフェース:

public abstract class Customer{//...}
public abstract ModelFactory{
    Customer CreateCustomer(int id,//...customer params);
}

組立データ:

public class CustomerDAO{
    private ModelFactory _modelFactory;

    public CustomerDAO(ModelFactory modelFactory){
         _modelFactory = modelFactory;
    }

    public Customer LoadCustomer(int id)
    { 
        // Data Access Code
        return _modelFactory.CreateCustomer(id,//...cutomer params);
    }
}

モデル アセンブリとデータ アセンブリの両方が ModelInterfaces レイヤーに依存し、Customer データ アクセス オブジェクトに ModelFactory クラスの実装を渡して、Customers を作成できるようにします。

于 2011-05-02T20:28:50.043 に答える
0

これはWeakReferencesの適切な使用法のように見えます - 顧客/電話のリスト全体をいつでもキャッシュに保持したくないでしょう? API ドキュメントでは、実際に大規模なキャッシュの管理を例として使用しています。

于 2011-05-02T20:08:22.143 に答える