use*_*521 6 c# asp.net dependency-injection unity-container asp.net-web-api
我有一个ASP .Net Web API控制器,我想要2个参数.第一个是EF上下文,第二个是缓存接口.如果我只有EF上下文,则构造函数被调用,但是当我添加缓存接口时,我得到错误:
尝试创建"MyV1Controller"类型的控制器时发生错误.确保控制器具有无参数的公共构造函数.
private MyEntities dbContext;
private IAppCache cache;
public MyV1Controller(MyEntities ctx, IAppCache _cache)
{
dbContext = ctx;
cache = _cache;
}
Run Code Online (Sandbox Code Playgroud)
我的UnityConfig.cs
public static void RegisterTypes(IUnityContainer container)
{
// TODO: Register your types here
container.RegisterType<MyEntities, MyEntities>();
container.RegisterType<IAppCache, CachingService>();
}
Run Code Online (Sandbox Code Playgroud)
我希望Entity现在知道两种类型,当为MyV1Controller函数发出请求时,它应该能够实例化一个实例,因为该构造函数接受它知道的类型,但事实并非如此.知道为什么吗?
[编辑]请注意,我创建了自己的类(IConfig)并注册了它并将其添加到构造函数中并且它工作正常,但每当我尝试添加IAppCache到我的构造函数并向API发出请求时,我得到错误告诉我它可以构造我的控制器类.我看到的唯一区别IAppCache是不在我的项目名称空间中,因为它是第三方类,但这应该与我的理解无关.
以下是CachingService的构造函数
public CachingService() : this(MemoryCache.Default) { }
public CachingService(ObjectCache cache) {
if (cache == null) throw new ArgumentNullException(nameof(cache));
ObjectCache = cache;
DefaultCacheDuration = 60*20;
}
Run Code Online (Sandbox Code Playgroud)
检查IAppCache实现CachingService以确保类在初始化时没有抛出任何异常.尝试创建控制器时发生错误时,该无参数异常是默认消息.它不是一个非常有用的例外,因为它没有准确地指出发生了什么真正的错误.
你提到它是第三方接口/类.它可能是请求容器不知道的依赖项.
Unity正在使用大多数参数调用构造函数,在本例中是...
public CachingService(ObjectCache cache) { ... }
Run Code Online (Sandbox Code Playgroud)
由于容器一无所知ObjectCache,null因此根据构造函数中的代码会抛出异常.
更新:
从评论中添加此内容,因为它可以证明对其他人有用.
container.RegisterType<IAppCache, CachingService>(new InjectionConstructor(MemoryCache.Default));
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅此处注册构造函数和参数.
| 归档时间: |
|
| 查看次数: |
999 次 |
| 最近记录: |