使用 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 所以你只需要注册 CacheHelperICacheRepository

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 范围。因为 CacheHelperSingleInstance,所以只会使用 ICacheRepository 的单个实例,这可能会导致错误。有关更多信息,请参阅 Captive Dependency

就您而言,您似乎不需要这种注册。

关于c# - Autofac - 在构建之前解决,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34500858/

10-10 07:21