使用 Unity 依赖项可以在构建容器之前解决。 Autofac 也可以这样吗?
下面的代码演示了我的场景 - 我需要解析 ICacheRepository
才能“更新”单例 CacheHelper
。
在 Unity 中,这可以简单地用 container.Resolve<ICacheRepository>()
代替 ???。在 Autofac 中呢?
var builder = new ContainerBuilder();
builder.RegisterType<CacheRepository>().As<ICacheRepository>();
var cacheHelper = new CacheHelper(???);
builder.RegisterInstance(cacheHelper).As<CacheHelper>();
其中
CacheHelper
类对 CacheRepository
有一个构造函数依赖。public class CacheHelper
{
private readonly ICacheRepository _repository;
public CacheHelper(ICacheRepository repository)
{
_repository = repository;
}
}
最佳答案
您不应该在构建过程中解析组件。 Autofac 能够解决对象图依赖性。在你的情况下 CacheHelper
取决于 ICacheRepository
所以你只需要注册 CacheHelper
和 ICacheRepository
var builder = new ContainerBuilder();
builder.RegisterType<CacheRepository>().As<ICacheRepository>();
builder.RegisterType<CacheHelper>().As<CacheHelper>();
当 Autofac 解析
CacheHelper
时,它将创建依赖关系图并使用 CacheHelper
实例创建 ICacheRepository
实例。如果你需要一个单例,你可以告诉 Autofac 只创建一个实例。var builder = new ContainerBuilder();
builder.RegisterType<CacheRepository>().As<ICacheRepository>();
builder.RegisterType<CacheHelper>().As<CacheHelper>().SingleInstance();
另一种解决方案是注册 lambda 表达式,这些注册会在您需要时调用,因此您可以在构建过程中解决问题:
var builder = new ContainerBuilder();
builder.RegisterType<CacheRepository>().As<ICacheRepository>();
builder.Register(c => new CacheHelper(c.Resolve<ICacheRepository>()))
.As<CacheHelper>()
.SingleInstance(); // It will result of having one CacheHelper whereas
// ICacheRepository is declared as .InstancePerDependency
使用此解决方案时要小心,因为
ICacheRepository
是在没有范围的情况下声明的,默认情况下将使用 InstancePerDependency
范围。因为 CacheHelper
是 SingleInstance
,所以只会使用 ICacheRepository
的单个实例,这可能会导致错误。有关更多信息,请参阅 Captive Dependency。就您而言,您似乎不需要这种注册。
关于c# - Autofac - 在构建之前解决,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34500858/