【发布时间】:2018-10-28 02:50:01
【问题描述】:
这就是问题所在。我目前正在使用 Autofac 在我的 AspNetCore MVC 应用程序中使用 TypedParameters 解决所有依赖项,但我认为我做错了,我可以做得更干净。
以下是以下代码示例
- 服务配置。
- 要注入的示例存储库
- 当前使用的方法
- 我想做的事
配置:
public static void Configure(IConfiguration cfg,IServiceCollection services)
{
/// some code is skipped here. Module registrant is just pulling out
/// the services from dlls and register them.
ioCBuilder.Populate(services);
ioCBuilder.RegisterModule(new ModuleRegistrant(cfg, registrantOptions));
IoCHelper.Container = ioCBuilder.Build();
}
示例存储库:
public class PriorityRepository: IPriorityRepository
{
public PriorityRepository(DbContext db)
{
Db = db;
}
/// <inheritdoc />
public Priority GetDefault()
{
return Db.Set<Priority>().SingleOrDefault(it => it.IsDefault);
}
}
目前我获得以下存储库:
public class PriorityController: Controller
{
public PriorityController(TestContext db)
{
var ctxParam = new TypedParameter(typeof(DbContext), db);
PriorityRepository = IoCHelper.Container.Resolve<IPriorityRepository>(ctxParam);
}
public IPriorityRepository PriorityRepository { get; set;}
}
我希望它是这样的
public class PriorityController: Controller
{
public PriorityController(IPriorityRepository priorityRepo)
{
PriorityRepository = priorityRepo;
}
public IPriorityRepository PriorityRepository { get; set;}
}
所以基本上问题是:如何在构造函数中注入已经注册的类型略有不同(更抽象)的类型?
【问题讨论】:
-
嗨,我对你的问题有点困惑。您的问题是否反映在提供的最后一个 sn-p 代码中?因为最后一个 sn-p 看起来是正确的。 “更抽象”的注册类型是什么意思?
-
如果您的意思是
IPriorityRepository并且您注册了此接口的唯一一个实现,那么您无需执行任何操作,它应该可以开箱即用。 -
我已经注册了依赖
TestDbContext,它继承了DbContext。IPrioriryRepository -> PriorityRepository的实现接受参数DbContext。它将与无参数构造函数一起使用,但它不适用于带参数的构造函数。所以我有一个问题:怎么办,所以我只注入存储库而不调用Autofac中的Context.Resolve方法
标签: c# asp.net-mvc asp.net-core-mvc autofac asp.net-core-mvc-2.1