当前位置:  开发笔记 > 编程语言 > 正文

Autofac - 在构建之前解决

如何解决《Autofac-在构建之前解决》经验,为你挑选了1个好方法。

使用Unity可以在构建容器之前解析依赖关系.这也适用于Autofac吗?下面的代码演示了我的场景 - 我需要解决这个问题ICacheRepository,以便"新手"单身CacheHelper.

在Unity中,简单地用container.Resolve()???代替.Autofac怎么样?

var builder = new ContainerBuilder();
builder.RegisterType().As();
var cacheHelper = new CacheHelper(???);
builder.RegisterInstance(cacheHelper).As();

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

public class CacheHelper
{
    private readonly ICacheRepository _repository;

    public CacheHelper(ICacheRepository repository)
    {
        _repository = repository;
    }
} 

Cyril Durand.. 9

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

var builder = new ContainerBuilder();
builder.RegisterType().As();
builder.RegisterType().As();

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

var builder = new ContainerBuilder();
builder.RegisterType().As();
builder.RegisterType().As().SingleInstance();

另一个解决方案是注册lambda表达式,这些注册在您需要时调用,因此您可以在构建过程中解决问题:

var builder = new ContainerBuilder();
builder.RegisterType().As();
builder.Register(c => new CacheHelper(c.Resolve()))
       .As()
       .SingleInstance(); // It will result of having one CacheHelper whereas 
                          // ICacheRepository is declared as .InstancePerDependency 

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

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



1> Cyril Durand..:

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

var builder = new ContainerBuilder();
builder.RegisterType().As();
builder.RegisterType().As();

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

var builder = new ContainerBuilder();
builder.RegisterType().As();
builder.RegisterType().As().SingleInstance();

另一个解决方案是注册lambda表达式,这些注册在您需要时调用,因此您可以在构建过程中解决问题:

var builder = new ContainerBuilder();
builder.RegisterType().As();
builder.Register(c => new CacheHelper(c.Resolve()))
       .As()
       .SingleInstance(); // It will result of having one CacheHelper whereas 
                          // ICacheRepository is declared as .InstancePerDependency 

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

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

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有