1

I am building a ASP.NET MVC 2.0 app on .NET 4.0 and am using Structuremap 2.6.1 for IoC. I recently added a ICookie and Cookie class, the Cookie class takes HttpContextBase as a constructor parameter (See below) and now when I run my app I get this error :No Default Instance defined for PluginFamily System.Web.HttpContextBase.

I have used this method before in another MVC app with the same stack but did not get this error. Am I missing something? If I do need to add some mapping code for HttoContextBase in my structuremap configuration file what would I use?

And help would be great!!!

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");
    }
}

1 Answer 1

10

I believe you would need to register the HttpContextBase on every request in your Begin_Request handler like so:

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

Update: Make sure you register a lambda, otherwise you StructureMap will store the HttpContext available at registration time as a singleton.

Sign up to request clarification or add additional context in comments.

2 Comments

Oh good call on the lambda Josh, I totally forgot about that.
Great call on the lambda, that bit me in the ass! You the man!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.