1

我在我的应用程序中使用 StructureMap 和 ASP.Net Identity。当我有这条线时Application_Start

ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory());

这是StructureMapControllerFactory

public class StructureMapControllerFactory : DefaultControllerFactory
{
    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        if (controllerType == null && requestContext.HttpContext.Request.Url != null)
            throw new InvalidOperationException(string.Format("Page not found: {0}",
                requestContext.HttpContext.Request.Url.AbsoluteUri.ToString(CultureInfo.InvariantCulture)));
        return ObjectFactory.GetInstance(controllerType) as Controller;
    }
}

return ObjectFactory.GetInstance(controllerType) as Controller;抛出StructureMapConfigurationException异常说:

No default Instance is registered and cannot be automatically determined for type 'IUserStore<Person>'

但是如果我删除ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory());行一切都很好,所以这是 StructureMap 的问题,而不是我的代码。

4

1 回答 1

5

我认为例外很明显。这可能是关于 Identity 模板中的 AccountController,它带有 2 个构造函数。

StructureMap 默认使用最贪婪的构造函数。该模板带有 2 个构造函数,一个默认构造函数和一个带有ApplicationUserManager对象的构造函数。

如果没有 StructureMap,则会调用默认构造函数,并且 ApplicationUserManager 将使用服务定位器反模式来解析。

StructureMap 现在必须创建ApplicationUserManagerand 因为这是一个它会尝试的具体类型。如果它是一个摘要,它将在那里抛出异常。然而ApplicationUserManager,只有一个构造函数需要一个IUserStore<Person>. 因为这是一个抽象并且容器没有注册这种类型,StructureMap 无法为您创建类型。

要解决这个问题,您应该删除默认构造函数并注册 ApplicationUserManager 和依赖服务,这些服务至少是一些实现 IUserStore 的组件。

编辑: 虽然您在评论中提到的解决方案可能有效,但这不是更好的解决方案,因为:

  1. 拥有多个构造函数是一种反模式
  2. 您现在正在使用服务定位器反模式来解决ApplicationUserManager来自HttpContext

VS2013 附带的模板需要一些工作才能与依赖注入一起使用。这将花费一些时间。好消息是,它是可行的,并且会极大地提高你对Owin依赖Asp.Net Identity注入和SOLID 设计的了解。

有几个关于如何开始重构模板以使用依赖注入的博客。你可以在这里这里读到

于 2015-03-24T22:47:24.700 回答