1

让我们假设一个类 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 和控制状态没什么可看的。我认为可以在序列化部分解决。我想我需要做的就是以某种方式让两个控件都使用一个共享的序列化器,并让这个控件明白,如果它已经序列化了具有给定 ID 的对象,则它需要返回相同的对象。

如果这需要类似的接口,那是可以接受的。

interface IFoo {
    int Id {get; set;}
}
4

1 回答 1

1

您可以将检索包装在另一个缓存层中。

例如,覆盖对 Foo 的比较以基于 Property1、Property2 创建一个包含 Foo 对象的全局 HashSet 创建一个将 Foo 作为输入并返回 Foo 的函数

该函数将查看Hashset中是否已经存在Foo,如果没有,它将添加它。该函数将始终从 HashSet 返回 Foo 的实例。

所以最后你可以说 var Foo = GetFooFromSomewhere(); var MyFooInstance = MyFooCache.GetFoo(Foo);

于 2019-01-18T16:07:55.250 回答