Autofac - 在构建之前解决

the*_*ker 4 c# autofac

使用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>();
Run Code Online (Sandbox Code Playgroud)

哪个CacheHelper类具有构造函数依赖性CacheRepository.

public class CacheHelper
{
    private readonly ICacheRepository _repository;

    public CacheHelper(ICacheRepository repository)
    {
        _repository = repository;
    }
} 
Run Code Online (Sandbox Code Playgroud)

Cyr*_*and 9

您不必在构建过程中解析组件.Autofac 能够解决对象图依赖性.在你的情况下CacheHelper取决于ICacheRepository你只需要注册CacheHelperICacheRepository

var builder = new ContainerBuilder();
builder.RegisterType<CacheRepository>().As<ICacheRepository>();
builder.RegisterType<CacheHelper>().As<CacheHelper>();
Run Code Online (Sandbox Code Playgroud)

Autofac解析时CacheHelper,它将创建依赖图并CacheHelper使用实例ofsi 创建实例 ICacheRepository.如果你需要一个Singleton,你可以告诉Autofac只创建一个实例.

var builder = new ContainerBuilder();
builder.RegisterType<CacheRepository>().As<ICacheRepository>();
builder.RegisterType<CacheHelper>().As<CacheHelper>().SingleInstance();
Run Code Online (Sandbox Code Playgroud)

另一个解决方案是注册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 
Run Code Online (Sandbox Code Playgroud)

请注意此解决方案,因为ICacheRepository声明的InstancePerDependency范围是默认情况下将使用范围.因为CacheHelperSingleInstance只的单个实例ICacheRepository将被用于这可能导致到错误.有关详细信息,请参阅强制依赖性.

在您的情况下,您似乎不需要这种注册.