2011-11-24 21 views
0

這是在asp.net mvc3中定義一些單例變量的機會嗎? 我想定義它(可能在global.asax),然後在控制器得到它,通過IOC解析器(結構圖)Asp.Net MVC3單例變量

簡單:我想有一個屬性具有相同的數據爲所有用戶,不依賴於請求,會話, ...例如在MVC應用程序的第一次啓動時,我將DateTime值設置到此屬性中,然後所有請求都可以查看此屬性並在控制器中修改此屬性。

回答

4

只需使用StructureMap創建使用依賴解析器像this blog post列出您的控制器。注入沒有直接的變量,但保存的實例變量:

public class GlobalScope 
{ 
    public String Variable { get; set; } 
} 

現在,你可以注入GlobalScope到您的控制器和設置/獲取變量,但請記住,你在多線程環境是哪裏的讀取和寫變量的訪問必須是同步的,否則你會遇到一些奇怪的競爭條件。

1

首先,你可以在.net中使用簡單的單例模式,這與asp.net或asp.net mvc中沒有特定的東西有關。

如果你想使用IoC,你可以註冊你的類實例像單個實例,IoC將只返回你唯一的類實例。將必要的屬性添加到此實例並進行編輯。初始化將在類型註冊步驟:

在樣品Autofac

builder.Register(MySingleton.Instance); 

,並與延遲初始化:

builder.Register(c => MySingleton.Instance); 

您也可以註冊類型和國際奧委會將控制你的類型的初始化,但在這種情況下,初始化期間不能設置默認值:

builder.RegisterType<MyType>().SingleInstance(); 
0

你的IoC容器可能擴展了單例的概念。 Ninject使用InSingletonScope。這會比靜態應用變量更好,因爲任何庫必須知道您的應用程序,然後纔有循環引用。

1

任何公開的變量或類Static駐留在AppDomain中,並且全局可用於所有會話。所以你可以簡單地:

  • 創建一個公共靜態類在APP_CODE中調用「CurrentApplication」,然後在所有會話中使用它。
  • 此外,國際石油公司也非常適合這種情況,因爲大多數IOC對象默認的生活方式是單身,因此也駐留在AppDomain中。
  • 另一種方法可以是使用一個「公共服務定位器」

已經知道使用所有3包括使用公共服務定位,找到IOC容器,這讓我們的生活方便。

希望這有助於