嗨,我們有一個PRISM WPF MVP應用程序,我們希望在同一模塊中的視圖之間共享數據。由於PRISM默認沒有狀態,所以想知道是否有任何方法可以實現這一點。目前我已經注入了一個字典的國家作爲後端存儲,但問題是它的全局即所有模塊都可用。我真的很想把這個注入作爲模塊特定的範圍。取決於模塊在PRISM WPF應用程序中注入狀態
我相信統一允許基於名稱向同一接口註冊不同的類,不知道我唯一的選擇是爲我的場景利用它。
任何幫助將是偉大的!謝謝!
-ioWint
嗨,我們有一個PRISM WPF MVP應用程序,我們希望在同一模塊中的視圖之間共享數據。由於PRISM默認沒有狀態,所以想知道是否有任何方法可以實現這一點。目前我已經注入了一個字典的國家作爲後端存儲,但問題是它的全局即所有模塊都可用。我真的很想把這個注入作爲模塊特定的範圍。取決於模塊在PRISM WPF應用程序中注入狀態
我相信統一允許基於名稱向同一接口註冊不同的類,不知道我唯一的選擇是爲我的場景利用它。
任何幫助將是偉大的!謝謝!
-ioWint
感謝您的更新解決方案。我試圖避免基於名稱的Unity註冊,這會迫使我的Presenter知道模塊狀態註冊密鑰。 我在讀Unity上的stackoverflow帖子,發現這裏的討論Is it possible to override parameter values when using Method Injection with Unity?。
經過幾個小時的試驗和錯誤,我結束了實現所需的功能。
我做了什麼:
我有一個BaseClass的我模塊 - > BaseModule:IModule的,我有一個國有資產在它這符合在Infrastructure.Interface定義我IStateService。我在BaseModule()構造函數中實例化這個State屬性。 注意:要採用這種方法,我必須讓我的演示者具有公共IStateService狀態;物業..
在模塊中註冊演示的時候,我指定
<UnityContainer>.RegisterType<MyPresenter, new InjectionProperty("State", State).
上午它將覆蓋演示其中有名稱爲「國家」的定義模塊的狀態實例值的公共屬性。 通過這種方式,我能夠將Modules State作爲View的每位演示者的狀態。
感謝大家指導我走向一個解決方案。
-ioWint
我會同意,確定範圍統一的登記種類與模塊名是開始的地方。
將本地(模塊級別)狀態對象注入到所有想要共享狀態的視圖中。如果定義狀態對象的接口對您的模塊是本地的,那麼其他模塊將無法引用狀態對象,因爲它們不能引用該接口。因此:如果模塊A有3個視圖需要一個實現IStatefulContainer(也在模塊A中聲明)的對象,並且IStatefulContainer使用RegisterInstance而不是RegisterType註冊到Unity,那麼您將擁有一個單獨的模塊。
我希望有一個管理狀態的「狀態」服務。這可以讓你在這裏添加更多的功能,如果你需要它,並且是一個更「棱鏡」的方法。
編輯
如果您使用跨模塊的這種狀態的對象,那麼你可以做到以下幾點:
1)將接口將由想要的任何模塊被引用的程序使用它。
組件A
public interface IBlah
{
string Add(string stateKey, string stateValue);
}
Assembly B (referencing Assembly A)
public class Module:IModule
{
private IUnityContainer _container;
public Module(IUnityContainer container)
{
_container=container;
}
public void Initialize()
{
IBlah blah1=new BlahContainer();
IBlah blah2=new BlahContainer();
_container.RegisterInstance<IBlah>(blah1,"BlahContainer1");
_container.RegisterInstance<IBlah>(blah2,"BlahContainer2");
}
}
模塊C(引用組件A)
_container.Resolve<IBlah>("BlahContainer1");
_container.Resolve<IBlah>("BlahContainer2");
基本上,我們定義在裝配我們很高興模塊之間共享的接口。一些項目具有「基礎結構」或常用程序集,其中包含由其他模塊使用的服務接口 - 這很適合。
然後,我們將模塊引用與其中的合約進行組裝。
目前我在這裏依靠「魔術弦」,但有很多方法可以解決這個問題。
希望這個更清楚一點。
沒有它的不工作!雖然在登錄模塊中,我已經註冊了一個範圍內部的實例,當下一個模塊加載時通過統一解析給出了登錄狀態。最後一個註冊的實例被返回,給我幾秒鐘的幻想,就好像它在工作!祝你好運! – ioWint
閱讀有關統一,從這個http://stackoverflow.com/questions/1550007/unity-what-are-the-injectionmembers-in-registertype-calls-我想我應該工作的方式就像說容器重寫值時解決我的模塊中的意見。假設我爲我的模塊創建了一個狀態,並且可能會在模塊加載中註冊視圖期間將其作爲覆蓋值。 – ioWint
啊 - 所以你加載在多個模塊的接口?在這種情況下,在模塊中聲明接口將不起作用,因爲其他模塊無法訪問它。我會用一些代碼示例和替代方法更新我的答案。 –