C# StructureMap认为它必须注入构造函数并抛出异常
我正在应用程序中使用StructureMap和ASP.Net标识。当我的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 {
应用程序中有这一行时\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:请参阅我对构造函数的编辑。还编辑了我的答案,作为对您解决方案的反应