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.關聯模組載入的區域和控制元件
理由:當使用某控制元件載入模組後,為防止重複記載此模組出現錯誤,在載入模組後要禁止該控制元件重複載入.在該模組解除安裝後又可以重新載入.
這個要看具體情況來設計,這是一個需要注意的點.
怕以後丟失,還是發一下,看起來可能會比較亂