如何解决这个“循环引用”问题?c#

本文关键字:循环引用 引用 循环 问题 何解决 解决 | 更新日期: 2023-09-27 17:54:08

我有一个类库来保存我的对象,所以:

xxxCommon '对象' Customer.cs

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

xxxData ' DC ' CustomerDC.cs (DataComponent)

  • 这个类调用许多进程并返回xxxCommon' objects
  • 中的对象

我现在的主要问题是循环引用,使"懒惰"加载,我需要设置

如何解决这个“循环引用”问题?c#

你可以使用回调方法来解决循环引用。

例如,类ActiveRecordSQL有一个创建实体的默认方法,但允许它被覆盖。

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;
}

需要传递自定义函数的类可以使用lambda表达式,或者传递对具有正确签名的自己的函数的引用。

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

"GetCustomReferrer"调用中间方法,简单地将方法传递给"GetWithCustomEntity"。"ReferrerFacade"子类化了一个实体,并且存在于不同的项目中。传递回调方法允许跨现有引用"向后"调用。

解决循环依赖的一种方法是在两个程序集之间设置一个层:

而不是这个场景;

Assembly Model:

public class Customer{ 
    //...
}

组装数据:

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

,其中模型程序集引用数据程序集,并且数据不能返回到模型中实例化客户。

你可以用;

组装模型:

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

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层,并且您将ModelFactory类的实现传递给客户数据访问对象,以便它可以创建客户。

这看起来像是WeakReferences的合适用法—您不想在任何时候都在缓存中保存客户/电话的整个列表,对吗?API文档实际上以管理大型缓存为例。