В образце / статье Microsoft для инъекций они имеют следующий код:
public void Initialize()
{
this.RegisterViewsAndServices();
EmployeesPresenter presenter = this.container.Resolve<EmployeesPresenter>();
IRegion mainRegion = this.regionManager.Regions[RegionNames.MainRegion];
mainRegion.Add(presenter.View);
}
http://msdn.microsoft.com/en-us/library/dd458920.aspx
здесь разрешается Presenter, который содержит открытое свойство типа IEmployeesView и используется для внедрения представления в регион. Преимущество разрешения презентатора заключается в том, что он автоматически привязывается к представлению (принимая его в конструкторе (посредством единства)). Однако не думаете ли вы, что Presenter склонен к сборке мусора, потому что ничто не имеет ссылки на Presenter после окончания действия метода initialize?
View / ViewModel, очевидно, не будет иметь ссылки на докладчика, если VM / View не имеет события, подписанного докладчиком. Мы можем перейти в несовместимое состояние, в котором представление активно, но ведущий удален.
Чтобы предотвратить сборку мусора презентатора, вероятно, нам понадобится свойство KeepAlive во ViewModel, которое просто содержит ссылку на презентатор для предотвращения его GC, но это звучит для меня хакерски. Что вы делаете или сделаете в этой ситуации?
Обратите внимание, что в ситуации, когда будет несколько экземпляров представления, зарегистрировать докладчика с помощью ContainerControlledLifetimeManager невозможно. Кроме того, если режим связи для докладчика (с представлением) осуществляется с помощью команд, а команды, как оказалось, являются DelegateCommands призмы, то они будут хранить только слабую ссылку на докладчика, так что это также не будет служить цели.