2010-09-23 123 views
1

我正在.NET 4.0上構建ASP.NET MVC 2.0應用程序,並且正在爲IoC使用Structuremap 2.6.1。我最近添加了ICookie和Cookie類,Cookie類將HttpContextBase作爲構造函數參數(請參見下文),現在,當我運行我的應用程序時,出現此錯誤:沒有爲PluginFamily System.Web.HttpContextBase定義默認實例。在構造函數中使用HttpContextBase時的構造圖錯誤

我以前在另一個MVC應用程序中使用過這個方法,但是沒有得到這個錯誤。我錯過了什麼嗎?如果我確實需要在我的結構圖配置文件中爲HttoContextBase添加一些映射代碼,我會用什麼?

和幫助將是偉大的!

Cookie.cs

public class Cookie : ICookie 
{ 
    private readonly HttpContextBase _httpContext; 
    private static bool defaultHttpOnly = true; 
    private static float defaultExpireDurationInDays = 1; 
    private readonly ICryptographer _cryptographer; 
    public Cookie(HttpContextBase httpContext, ICryptographer cryptographer) 
    { 
     Check.Argument.IsNotNull(httpContext, "httpContext"); 
     Check.Argument.IsNotNull(cryptographer, "cryptographer"); 
     _cryptographer = cryptographer; 
     _httpContext = httpContext; 
    } 
    public static bool DefaultHttpOnly 
    { 
     [DebuggerStepThrough] 
     get { return defaultHttpOnly; } 

     [DebuggerStepThrough] 
     set { defaultHttpOnly = value; } 
    } 

    public static float DefaultExpireDurationInDays 
    { 
     [DebuggerStepThrough] 
     get { return defaultExpireDurationInDays; } 

     [DebuggerStepThrough] 
     set 
     { 
      Check.Argument.IsNotZeroOrNegative(value, "value"); 
      defaultExpireDurationInDays = value; 
     } 
    } 

    public T GetValue<T>(string key) 
    { 
     return GetValue<T>(key, false); 
    } 

    public T GetValue<T>(string key, bool expireOnceRead) 
    { 
     var cookie = _httpContext.Request.Cookies[key]; 
     T value = default(T); 
     if (cookie != null) 
     { 
      if (!string.IsNullOrWhiteSpace(cookie.Value)) 
      { 
       var converter = TypeDescriptor.GetConverter(typeof(T)); 
       try 
       { 
        value = (T)converter.ConvertFromString(_cryptographer.Decrypt(cookie.Value)); 
       } 
       catch (NotSupportedException) 
       { 
        if (converter.CanConvertFrom(typeof(string))) 
        { 
         value = (T)converter.ConvertFrom(_cryptographer.Decrypt(cookie.Value)); 
        } 
       } 
      } 
      if (expireOnceRead) 
      { 
       cookie = _httpContext.Response.Cookies[key]; 

       if (cookie != null) 
       { 
        cookie.Expires = DateTime.Now.AddDays(-100d); 
       } 
      } 
     } 
     return value; 
    } 

    public void SetValue<T>(string key, T value) 
    { 
     SetValue(key, value, DefaultExpireDurationInDays, DefaultHttpOnly); 
    } 

    public void SetValue<T>(string key, T value, float expireDurationInDays) 
    { 
     SetValue(key, value, expireDurationInDays, DefaultHttpOnly); 
    } 

    public void SetValue<T>(string key, T value, bool httpOnly) 
    { 
     SetValue(key, value, DefaultExpireDurationInDays, httpOnly); 
    } 

    public void SetValue<T>(string key, T value, float expireDurationInDays, bool httpOnly) 
    { 
     TypeConverter converter = TypeDescriptor.GetConverter(typeof(T)); 
     string cookieValue = string.Empty; 
     try 
     { 
      cookieValue = converter.ConvertToString(value); 
     } 
     catch (NotSupportedException) 
     { 
      if (converter.CanConvertTo(typeof(string))) 
      { 
       cookieValue = (string)converter.ConvertTo(value, typeof(string)); 
      } 
     } 
     if (!string.IsNullOrWhiteSpace(cookieValue)) 
     { 
      var cookie = new HttpCookie(key, _cryptographer.Encrypt(cookieValue)) 
      { 
       Expires = DateTime.Now.AddDays(expireDurationInDays), 
       HttpOnly = httpOnly 
      }; 
      _httpContext.Response.Cookies.Add(cookie); 
     } 
    } 
} 

IocMapping.cs

public class IoCMapping 
{ 
    public static void Configure() 
    { 

     var connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ProjectName.Core.Properties.Settings.ProjectNameConnectionString"].ConnectionString; 
     MappingSource mappingSource = new AttributeMappingSource(); 
     ObjectFactory.Initialize(x => 
     { 
      x.Scan(scan => 
      { 
       scan.Assembly("ProjectName.Core"); 
       scan.Assembly("ProjectName.WebUI"); 
       scan.WithDefaultConventions(); 
      }); 
      x.For<IUnitOfWork>().HttpContextScoped().Use<UnitOfWork>(); 
      x.For<IDatabase>().HttpContextScoped().Use<Database>().Ctor<string>("connection").Is(connectionString).Ctor<MappingSource>("mappingSource").Is(mappingSource); 
      x.For<ILogger>().Singleton().Use<NLogLogger>(); 
      x.For<ICacheManager>().Singleton().Use<CacheManager>().Ctor<System.Web.Caching.Cache>().Is(HttpRuntime.Cache); 
      x.For<IEmailSender>().Singleton().Use<EmailSender>(); 
      x.For<IAuthenticationService>().HttpContextScoped().Use<AuthenticationService>(); 
      x.For<ICryptographer>().Use<Cryptographer>(); 
      x.For<IUserSession>().HttpContextScoped().Use<UserSession>(); 
      x.For<ICookie>().HttpContextScoped().Use<Cookie>(); 
      x.For<ISEORepository>().HttpContextScoped().Use<SEORepository>(); 
      x.For<ISpotlightRepository>().HttpContextScoped().Use<SpotlightRepository>(); 
      x.For<IContentBlockRepository>().HttpContextScoped().Use<ContentBlockRepository>(); 
      x.For<ICatalogRepository>().HttpContextScoped().Use<CatalogRepository>(); 
      x.For<IPressRoomRepository>().HttpContextScoped().Use<PressRoomRepository>(); 
      x.For<IEventRepository>().HttpContextScoped().Use<EventRepository>(); 
      x.For<IProductRegistrationRepository>().HttpContextScoped().Use<ProductRegistrationRepository>(); 
      x.For<IWarrantyRepository>().HttpContextScoped().Use<WarrantyRepository>(); 
      x.For<IInstallerRepository>().HttpContextScoped().Use<InstallerRepository>(); 
      x.For<ISafetyNoticeRepository>().HttpContextScoped().Use<SafetyNoticeRepository>(); 
      x.For<ITradeAlertRepository>().HttpContextScoped().Use<TradeAlertRepository>(); 
      x.For<ITestimonialRepository>().HttpContextScoped().Use<TestimonialRespository>(); 
      x.For<IProjectPricingRequestRepository>().HttpContextScoped().Use<ProjectPricingRequestRepository>(); 
      x.For<IUserRepository>().HttpContextScoped().Use<UserRepository>(); 
      x.For<IRecipeRepository>().HttpContextScoped().Use<RecipeRepository>(); 
     }); 

     LogUtility.Log.Info("Registering types with StructureMap"); 
    } 
} 

回答

10

我相信你會需要註冊HttpContextBase在每次請求在你的Begin_Request處理,像這樣:

For<HttpContextBase>().Use(() => new HttpContextWrapper(HttpContext.Current)); 

更新:確保你註冊一個lambda,否則你的StructureMap將存儲HttpContext ava在註冊時作爲一個單身人士是可用的。

+0

噢拉布達Josh的好電話,我完全忘了這一點。 – 2010-09-23 15:29:25

+0

謝謝你們的回覆,非常感謝! – Paul 2010-09-23 18:00:09

+0

拉姆達的偉大呼喚,那在屁股上咬我!你這個人! – 2011-06-17 21:56:35