Asp.net
使用 2 個參數注入建構子不起作用
我有一個 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));參考此處註冊建構子和參數以獲取更多詳細資訊。