Autofac - 在构建之前解决

时间:2015-12-28 21:13:00

标签: 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>();

CacheHelper类对CacheRepository具有构造函数依赖性。

public class CacheHelper
{
    private readonly ICacheRepository _repository;

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

1 个答案:

答案 0 :(得分:5)

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

var builder = new ContainerBuilder();
builder.RegisterType<CacheRepository>().As<ICacheRepository>();
builder.RegisterType<CacheHelper>().As<CacheHelper>();

Autofac 解析CacheHelper时,它将创建依赖关系图并使用实例CacheHelper创建ICacheRepository的实例。如果您需要 Singleton ,您可以告诉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

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