Как сохранить две ссылки на один и тот же объект после сериализации - PullRequest
0 голосов
/ 18 января 2019

Допустим, класс 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*"
}

Я прекрасно понимаю, почему это происходит, но я понятия не имею, как архивировать это.

Edit: Я думаю, что на самом деле не так много, чтобы увидеть с ASP и контроль состояния. Я думаю, что это может быть решено в части сериализации. Я думаю, все, что мне нужно, это каким-то образом заставить оба элемента управления использовать общий сериализатор и дать понять, что, если он уже сериализовал объект с заданным идентификатором, он должен вернуть один и тот же объект.

Если для этого требуется подобный интерфейс, это приемлемо.

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

1 Ответ

0 голосов
/ 18 января 2019

Вы можете просто обернуть поиск в другой слой кэша.

например. Сравнение переопределения для Foo будет основано на Property1, Property2 создать глобальный HashSet, содержащий объекты Foo создать функцию, которая принимает в качестве входных данных Foo и возвращает Foo

Функция увидит, есть ли уже Foo в Hashset, если нет, она добавит его. функция всегда будет возвращать экземпляр Foo из HashSet.

так что, наконец, вы можете сказать var Foo = GetFooFromSomewhere (); var MyFooInstance = MyFooCache.GetFoo (Foo);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...