我一直关注this post以了解有关使用AutoFac的DI。我的DB上下文在Startup.cs中注册,如下所示:
builder.RegisterType<MyDb>().As<IMyDbCtx>().InstancePerRequest();
我还按照说明创建了ApplicationUserStore类,并注册了这样的类型:
builder.RegisterType<ApplicationUserStore>().As<IUserStore<ApplicationUser>>().InstancePerRequest();
这一切都很好,直到我意识到ApplicationUserStore期望它的构造函数中的具体DbContext传递给它的基础构造函数:
public ApplicationUserStore(MyDb context)
: base(context)
{
}
当我运行应用程序并尝试加载注册页面时,这是我看到的错误:
没有任何构造函数与&#39; Autofac.Core.Activators.Reflection.DefaultConstructorFinder&#39; on type&#39; TestApp.Service.IdentityConfig.ApplicationUserStore&#39;可以使用可用的服务和参数调用: 无法解析参数&#39; TestApp.Data.MyDb context&#39;构造函数&#39; Void .ctor(MyApp.Data.MyDb)&#39;。
我认为这是打破,因为我已经将MyDb 设置为 IMyDbCtx,因此它不会接受具体类型。这很好,因为我不希望通过在某些位置注入抽象和在其他位置实现抽象来实现不一致。
有没有人对如何将IMyDbCtx传递给UserStore ctor有任何想法,特别是对于AutoFac?
答案 0 :(得分:1)
这不是一个理想的解决方案,但是当参数传递给基础构造函数时,我决定将接口强制转换为具体类型:
public ApplicationUserStore(IMyDbCtx context) :base((MyDb)context) { }
答案 1 :(得分:0)
您可以根据需要在任意数量的别名下注册MyDb类型:
builder.RegisterType<MyDb>()
.As<MyDb>()
.As<IMyDbCtx>()
.InstancePerRequest();
在这种情况下,Autofac可以解析应用程序用户存储。但它会杀死依赖注入的整个想法,因为你提供了混凝土类型。