让我们假设一个像Foo这样的类
[Serializable]
class Foo{
int Id { get; set; }
String Property1 { get ;set; }
String Property2 { get ;set; }
}
我有一个自定义的ASP控件,例如
class MyControl : CompositeControl {
object MyObject { get; set; }
string PropertyName { get; set; }
}
我有一个类似ASPX的页面
<MyControl id="mycontrol1" MyObject="<%# MyFoo %>" PropertyName="Property1"></MyControl>
<MyControl id="mycontrol2" MyObject="<%# MyFoo %>" PropertyName="Property2"></MyControl>
//code behind
Foo MyFoo { get; set; }
protected override void OnInit(EventArgs e){
if (Page.IsPostBack) return;
//retrieve from Db:
MyFoo = new Foo {
Id = 123,
Property1 = "Hello",
Property2 = "World"
};
}
该控件用于更改PropertyName指定的属性,假设该控件仅向该属性添加*,则可以正常工作。我使用控制状态在回发之间存储实体。而且这里出错了。
我创建了一个对象Foo。
我将此对象绑定到两个控件
两个控件都将实体序列化为其控件状态
两个控件均在属性中添加*。 (前端)
回发后,两个控件均从其控件状态反序列化对象。
我最终遇到两个对象:
//In mycontrol1.MyFoo
{
Id = 123,
Property1 = "Hello*",
Property2 = "World"
}
//In mycontrol2.MyFoo
{
Id = 123,
Property1 = "Hello",
Property2 = "World*"
}
我打算让两个实例都引用同一个对象。
//mycontrol1.MyFoo and
//mycontrol2.MyFoo both referring to
{
Id = 123,
Property1 = "Hello*",
Property2 = "World*"
}
我完全理解为什么会这样,但是我不知道如何将其存档。
编辑: 我认为使用ASP和contol状态实际上没什么可看的。我认为可以在序列化部分中解决。我只需要做的就是使两个控件都使用共享的序列化器,并让该对象理解如果它已经使用给定的ID序列化了一个对象,则需要返回相同的对象。
如果这需要类似的接口,那就可以接受。
interface IFoo {
int Id {get; set;}
}
答案 0 :(得分:0)
您可以将检索结果包装在另一个缓存层中。
例如 基于Property1,Property2覆盖Foo上的比较 创建一个包含Foo对象的全局HashSet 创建一个将Foo作为输入并返回Foo的函数
该函数将查看哈希集中是否已经有Foo,如果没有,它将添加它。 该函数将始终从HashSet返回Foo的实例。
所以最后你可以说 var Foo = GetFooFromSomewhere(); var MyFooInstance = MyFooCache.GetFoo(Foo);