Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# StructureMap认为它必须注入构造函数并抛出异常_C#_Asp.net_Asp.net Mvc_Structuremap_Structuremap3 - Fatal编程技术网

C# StructureMap认为它必须注入构造函数并抛出异常

C# StructureMap认为它必须注入构造函数并抛出异常,c#,asp.net,asp.net-mvc,structuremap,structuremap3,C#,Asp.net,Asp.net Mvc,Structuremap,Structuremap3,我正在应用程序中使用StructureMap和ASP.Net标识。当我的应用程序中有这一行时\u Start ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory()); 这是StructureMapControllerFactory: public class StructureMapControllerFactory : DefaultControllerFactory {

我正在应用程序中使用StructureMap和ASP.Net标识。当我的
应用程序中有这一行时\u 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;
    }
}
返回ObjectFactory.GetInstance(controllerType)作为控制器抛出一个
StructureMappConfigurationException
异常,表示:

No default Instance is registered and cannot be automatically determined for type 'IUserStore<Person>'
未注册任何默认实例,无法自动确定类型“IUserStore”

但是如果我删除
ControllerBuilder.Current.SetControllerFactory(新结构MapControllerFactory())行一切正常,所以这是StructureMap的问题,不是我的代码。

我认为例外情况很明显。它可能与标识模板中的AccountController有关,该模板带有2个构造函数

默认情况下,StructureMap将使用。该模板带有2个构造函数,一个默认构造函数和一个带有
ApplicationUserManager
对象的构造函数

如果没有StructureMap,将调用默认构造函数,并使用解析函数解析ApplicationUserManager

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

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

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

  • 您现在使用服务定位器反模式从
    HttpContext
  • VS2013附带的模板需要一些工作才能与依赖项注入一起使用。这需要一些时间。好消息是,这是可能的,也是可行的,它将极大地提高您对
    Owin
    Asp.Net Identity
    、依赖项注入和


    有几个博客介绍了如何开始重构模板以使用依赖项注入。你可以读到这一点,我认为例外情况很明显。它可能与标识模板中的AccountController有关,该模板带有2个构造函数

    默认情况下,StructureMap将使用。该模板带有2个构造函数,一个默认构造函数和一个带有
    ApplicationUserManager
    对象的构造函数

    如果没有StructureMap,将调用默认构造函数,并使用解析函数解析ApplicationUserManager

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

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

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

  • 您现在使用服务定位器反模式从
    HttpContext
  • VS2013附带的模板需要一些工作才能与依赖项注入一起使用。这需要一些时间。好消息是,这是可能的,也是可行的,它将极大地提高您对
    Owin
    Asp.Net Identity
    、依赖项注入和


    有几个博客介绍了如何开始重构模板以使用依赖项注入。你可以读到这方面的内容,并且

    谢谢你的理由。但是StructureMap支持多个构造函数。我已经将它添加到我的配置中,并且成功了:)
    x.ForConcreteType().Configure.SelectConstructor(()=>new AccountController())所以请更新你的答案,以便我检查它是否被接受。@Ahmadalishafie:请参阅我对构造函数的编辑。还编辑了我的答案,作为对您解决方案的反应。感谢您的原因。但是StructureMap支持多个构造函数。我已经将它添加到我的配置中,并且成功了:)
    x.ForConcreteType().Configure.SelectConstructor(()=>new AccountController())所以请更新你的答案,以便我检查它是否被接受。@Ahmadalishafie:请参阅我对构造函数的编辑。还编辑了我的答案,作为对您解决方案的反应