簡體   English   中英

StructureMap認為它必須注入構造函數並引發異常

[英]StructureMap thinks it has to inject to constructor and throws exception

我在我的應用程序中使用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的問題,而不是我的代碼。

我認為例外是明確的。 這可能與Identity模板中的AccountController有關,該模板帶有2個構造函數。

默認情況下,StructureMap將使用最貪婪的構造函數 該模板帶有2個構造函數,一個默認構造函數和一個帶有ApplicationUserManager對象的構造函數。

如果沒有StructureMap,則將調用默認構造函數,並且將使用服務定位器反模式來解析ApplicationUserManager。

現在,StructureMap必須創建ApplicationUserManager ,因為這是一種具體類型,它將嘗試使用。 如果它是一個抽象,它將在那里拋出異常。 但是, ApplicationUserManager具有單個構造函數,該構造函數需要IUserStore<Person> 因為這是一個抽象,並且容器沒有這種類型的注冊,所以StructureMap無法為您創建類型。

為了解決這個問題,您應該刪除默認的構造函數,並注冊ApplicationUserManager和依賴的服務,這些服務至少是實現IUserStore的某些組件。

編輯:雖然您在評論中提到的解決方案可能會起作用,但這不是首選的解決方案,因為:

  1. 具有多個構造函數是一種反模式
  2. 您現在正在使用服務定位器反模式來從HttpContext解析ApplicationUserManager

VS2013隨附的模板需要進行一些工作才能用於依賴項注入。 這將花費一些時間。 好消息是,它是可能且可行的,它將大大提高您對OwinAsp.Net Identity ,依賴注入和SOLID設計的了解

關於如何開始重構模板以使用依賴項注入的博客很多。 你可以在這里這里讀到

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM