1. 程式人生 > >prism模組化問題總結(2)

prism模組化問題總結(2)

繼續討論出現的問題

 

1.重新載入時,不要將view臨時儲存起來

理由:這樣將導致重新載入時,view的容器還存在,view無法加入。還會導致記憶體的問題.刪除時也應該將其刪除.

private List<object> viewList = new List<object>();

private void AddRegionMenu(string region, string header,Func<object> view)
{
    MenuItem regionItem = new MenuItem() { Header = header };

    regionItem.Items.Add(CreateMenuItem("載入模組", new Action(() =>
    {
        var currentView = view();
        viewList.Add(currentView);
        _regionManager.Regions[region].Add(currentView,"",true);
            })));
   
 }

 

 

2.註冊一個模組的時候最好重新註冊一個新的UnityContainer容器

 

理由:很有可能在解除安裝這個模組的時候,需要釋放資源,即呼叫UnityContainer的dispose方法.若呼叫頂級容器方法的話,那麼預設容器註冊的prism服務將無法使用了.

private readonly IUnityContainer _container;   

public Module(IUnityContainer container)
{
    this._container = container.CreateChildContainer();
}

 

3.當模組UnityContainer容器新註冊時,不要用ServiceLocator全域性呼叫子容器註冊的服務

理由:ServiceLocator只能呼叫等級容器的服務,無法呼叫子容器的服務

this._container = container.CreateChildContainer();
_container.RegisterType<IEmployeeService, EmployeeService>(new ContainerControlledLifetimeManager());
ServiceLocator.Current.GetInstance<IEmployeeService>();//wrong

重新在該模組註冊一個單例的例項來呼叫,或者將子容器命名存到父容器中

this._container = container.CreateChildContainer();
container.RegisterInstance("test",_container);
_container.RegisterType<IEmployeeService, EmployeeService>(new ContainerControlledLifetimeManager());
ServiceLocator.Current.GetInstance<IUnityContainer>("test").Resolve<IEmployeeService>();

 

一般情況下

4.在模組化控制元件中以ServiceLocator呼叫Service

理由:以Region的方式新增View一定程度上肯定不如直接拉控制元件到介面上方便.

某些控制元件是可以這麼做的.因為其功能是固定的.這個功能與asp.net的控制元件做法很相似.將控制元件與邏輯的資料封裝在一起,使得一個控制元件就是一個小功能.

<local:CheckBoxSkillList  />

上面的xaml很容易讓人接受,即一個skill的checkbox列表.但這個控制元件需要service來獲取資料.

否則我們則要這樣做:

var view= new CheckBoxSkillList();
_regionManager.Regions[region].Add(view);

 

一個小的ui控制元件並不適合這麼做,這裡可能會有爭議.這感覺上破壞了mvc.ui與資料牽涉了關係.

 

5.釋放資源與重新註冊服務

理由:儘可能回收記憶體.

在Region中移除View時,最好先呼叫UnityContainer容器的dispose方法.只要在該容器中的服務,實現了IDisposable介面的物件都會呼叫到,然後重新建立容器,並重新註冊服務.

這在一定程度上加快了垃圾回收,雖然無法完全回收.

_container.Dispose();
_container = _container.Parent.CreateChildContainer();

RegisterViewAndService();

 

6.關聯模組載入的區域和控制元件

理由:當使用某控制元件載入模組後,為防止重複記載此模組出現錯誤,在載入模組後要禁止該控制元件重複載入.在該模組解除安裝後又可以重新載入.

image

 

這個要看具體情況來設計,這是一個需要注意的點.

prism behavior圖示

怕以後丟失,還是發一下,看起來可能會比較亂

繪圖1