如何解决这个“循环引用”问题?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 中的对象
我现在的主要问题是循环引用,使"懒惰"加载,我需要设置
你可以使用回调方法来解决循环引用。
例如,类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文档实际上以管理大型缓存为例。