【问题标题】:StructureMap can not find a default instance for HttpServerUtilityStructureMap 找不到 HttpServerUtility 的默认实例
【发布时间】:2010-09-07 09:12:54
【问题描述】:

我有一个依赖于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,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a
作用域为:单例

我错过了什么?

【问题讨论】:

  • 仅供参考 - 您不需要扫描包含 HttpServerUtilityBase 的程序集。按照约定,扫描仅用于注册类型。在这种情况下,您显式注册了 HttpServerUtiltityBase 类型,因此约定扫描不会给您带来任何好处。

标签: c# structuremap ioc-container


【解决方案1】:

事实证明,修复很简单。我需要为HttpServerUtilityWrapper指定构造函数参数

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

【讨论】:

  • 忍者:kernel.Bind&lt;HttpServerUtility&gt;().ToConstant(HttpContext.Current.Server);kernel.Bind&lt;HttpServerUtilityBase&gt;().To&lt;HttpServerUtilityWrapper&gt;().InSingletonScope();
猜你喜欢
  • 2012-12-05
  • 2013-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多