2011-07-04 70 views
1

註冊默認實例我有一個具有代表當前上下文的靜態屬性(MyService.Context)類(MyService)(這是特定於當前登錄的用戶,所以它的變化)。在StructureMap

我想要實現我

ObjectFactory.Initialize(x => 
      { 
       x.For<IMyService>().Use<MyInstance>(c => c.Use(MyService.Context)); 
      }); 

即因此,每ObjectFactory.GetInstance<IMyService>()我到MyService.Context

一個引用是可行的?

UPDATE

我不能使用一個單件模式,因爲根據做出請求(經由HttpContext的)用戶MyService.Context變化。

在上述的λ參數c僞代碼表示一個SM上下文中,這樣我可以針對每個請求返回自定義的結果。我知道SM的Intercept()的,但它的發射對象被創建後 - 不代替

+0

多個用戶是否同時使用該應用程序(如在Web應用程序中)?如果是這樣,您不能使用靜態屬性來保存用戶特定的信息。 –

回答

3

如果你可以用一個屬性在那裏工作是添加OnCreation方法的可能性。所提供的動作就是創建後對實例執行:

ObjectFactory.Initialize(x => 
     { 
      x.For<IMyService>() 
      .Use<MyInstance>() 
      .OnCreation(x => x.Context = MyService.Context; 
     }); 

或者你可以使用延遲初始化,並提供一個Func每當需要一個新的實例,其執行Use方法。這應該在正確的上下文中執行:

ObjectFactory.Initialize(x => 
     { 
      x.For<IMyService>() 
      .Use<MyInstance>(() => new MyInstance(MyService.Context); 
     }); 

我希望其中一種方法適用於您。

+1

感謝您的回答。我意識到我沒有說清楚,代碼沒有顯示我想做什麼。我已經更新了這個問題。 – Muxa

+0

好吧,我編輯我的答案。 – Zebi

+0

謝謝,我用x.For ()。使用((=> MyService.Context)),它工作完美。 – Muxa

0

前提是爲MyService先後爲IContext一個構造函數參數:

For<IContext>().Add(c => MyService.Context).Named("context"); 
For<IMyService>().Use<MyService>() 
    .Ctor<IContext>().Is(c => c.GetInstance<IContext>("context")); 

,或者如果你想默認情況下爲所有dependees:

For<IContext>().Use(() => MyService.Context); 
For<IMyService>().Use<MyService>(); 

Lambda表達式會在兩種情況下會導致在請求MyService實例時要解析的上下文。