Asp.net

使用 2 個參數注入建構子不起作用

  • October 19, 2020

我有一個 ASP .Net Web API 控制器,我想採用 2 個參數。第一個是 EF 上下文,第二個是記憶體介面。如果我只有 EF 上下文,則呼叫建構子,但是當我添加記憶體介面時,會出現錯誤:

嘗試創建類型為“MyV1Controller”的控制器時發生錯誤。確保控制器有一個無參數的公共建構子。

private MyEntities dbContext;
private IAppCache cache;

public MyV1Controller(MyEntities ctx, IAppCache _cache)
{
    dbContext = ctx;
    cache = _cache;
}

我的 UnityConfig.cs

public static void RegisterTypes(IUnityContainer container)
{
   // TODO: Register your types here
   container.RegisterType<MyEntities, MyEntities>();
   container.RegisterType<IAppCache, CachingService>();
}

我希望當對 MyV1Controller 函式發出請求時,Entity 現在知道這兩種類型,它應該能夠實例化一個實例,因為該建構子採用它知道的類型,但事實並非如此。知道為什麼嗎?

$$ EDIT $$IConfig請注意,我創建IAppCache了 自己的類(我的控制器類。我看到的唯一區別IAppCache是不在我的項目名稱空間中,因為它是第 3 方類,但據我所知,這無關緊要。 這是 CachingService 的建構子

public CachingService() : this(MemoryCache.Default) { } 

public CachingService(ObjectCache cache) { 
   if (cache == null) throw new ArgumentNullException(nameof(cache)); 
   ObjectCache = cache; 
   DefaultCacheDuration = 60*20; 
}

檢查IAppCache實現CachingService以確保類在初始化時沒有拋出任何異常。當嘗試創建控制器時發生錯誤時,該無參數異常是預設消息。這不是一個非常有用的異常,因為它不能準確地指出發生的真正錯誤是什麼。

您提到它是第 3 方介面/類。它可能正在請求容器不知道的依賴項。

使用預設建構子引用Unity Framework IoC

Unity 正在呼叫具有最多參數的建構子,在這種情況下是……

public CachingService(ObjectCache cache) { ... }

由於容器對它一無所知,它將根據建構子中的程式碼在其中ObjectCache傳遞null異常。

更新:

從評論中添加它,因為它可以證明對其他人有用。

container.RegisterType<IAppCache, CachingService>(new InjectionConstructor(MemoryCache.Default));

參考此處註冊建構子和參數以獲取更多詳細資訊。

引用自:https://stackoverflow.com/questions/40727756