2015-03-24 36 views
1

我在我的应用程序中使用StructureMap和ASP.Net Identity。当我在我的Application_StartStructureMap认为它必须注入构造函数并抛出异常

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的问题,而不是我的代码。

回答

5

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

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

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

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

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

编辑: 当你在评论可能工作中提到的解决方案,这是不是因为最好的解决办法:

  1. Having multiple constructors is an anti-pattern
  2. 您现在正在使用的服务定位器反模式解决ApplicationUserManager来自HttpContext

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

有几个博客关于如何开始重构模板以使用依赖注入。您可以阅读关于该herehere

+0

感谢您的原因。但StructureMap支持多个构造函数。我添加了这个到我的配置和工作:)'x.ForConcreteType ()。Configure.SelectConstructor(()=>新的AccountController());'所以请更新您的答案,所以我检查它被接受。 – 2015-03-24 23:08:08

+0

@ahmadalishafiee:查看我的关于构造函数的编辑。还编辑我的答案作为您的解决方案的反应 – 2015-03-25 10:53:47

相关问题