StructureMap не может найти экземпляр по умолчанию для HttpServerUtility - PullRequest
0 голосов
/ 07 сентября 2010

У меня есть класс, который опирается на HttpServerUtilityBase. Я планировал получить карту структуры для использования HttpServerUtilityWrapper в качестве экземпляра по умолчанию.Ничего странного там нет.Однако, как только я добавил объявления в свой реестр, Structuremap не может разрешить экземпляр, и я получаю ошибку 202.

Это мой реестр:

public class ApplicationRegistry : Registry
{
    public ApplicationRegistry()
    {
        Scan(scanThe =>
        {
            scanThe.AssembliesFromApplicationBaseDirectory();
            scanThe.WithDefaultConventions();
        });

        Scan(scanThe =>
        {
            scanThe.AssemblyContainingType<HttpServerUtilityBase>();
        });

        SetAllProperties(x =>
        {
            x.WithAnyTypeFromNamespaceContainingType<IFinancialYearRepository>();
            x.WithAnyTypeFromNamespaceContainingType<IUserManagementFacade>();
            x.WithAnyTypeFromNamespaceContainingType<IBulkTypeImporter>();
            x.OfType<ILog>();
            x.OfType<ISessionManager>();
        });

        For<IUnitOfWork>()
            .HttpContextScoped()
            .Use(() => new EFUnitOfWork(
                    ConfigurationManager.ConnectionStrings["PublishedEFSqlServer"].ConnectionString
                    )).Named("publishedUnitOfWork");

        For<IUnitOfWork>()
            .HttpContextScoped()
            .Use(() => new EFUnitOfWork(
                ConfigurationManager.ConnectionStrings["UnpublishedEFSqlServer"].ConnectionString
                )).Named("unpublishedUnitOfWork");

        For<ILog>()
            .AlwaysUnique()
            .Use(s =>
            {
                ILog loggger;
                if (s.ParentType == null)
                {
                    loggger = LogManager.GetLogger(s.BuildStack.Current.ConcreteType);
                }
                else
                {
                    loggger = LogManager.GetLogger(s.ParentType);
                }

                if (HttpContext.Current.User != null && HttpContext.Current.User.Identity.IsAuthenticated)
                {
                    ThreadContext.Properties["user"] = HttpContext.Current.User.Identity.Name;
                }
                return loggger;
            });

        For<ISessionManager>().Singleton();

        For<HttpServerUtilityBase>()
            .Singleton()
            .Use<HttpServerUtilityWrapper>();
    }
}

Все выглядитхорошо, но я явно чего-то не понимаю.Кроме того, строка из сгенерированного путем вызова WhatDoIHave(), которая ссылается на HttpServerUtilityBase, похоже, имеет ссылку на HttpServerUtilityWrapper, поэтому я предполагаю, что она должна просто работать.


HttpServerUtilityBase (System.Web.HttpServerUtilityBase) 3bf840df-e159-4dcf-93ef-211bb7484698 Сконфигурированный экземпляр System.Web.HttpServerUtilityWrapper, System.Web, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b03f5f7f11d506 * as

as5eed3505

Чего мне не хватает?

1 Ответ

1 голос
/ 07 сентября 2010

Оказывается, исправить это просто.Мне нужно указать аргумент конструктора для HttpServerUtilityWrapper

For<HttpServerUtilityBase>()
    .Singleton()
    .Use<HttpServerUtilityWrapper>()
    .Ctor<HttpServerUtility>().Is(HttpContext.Current.Server);
...