可以在构建容器之前解析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;
}
}
答案 0 :(得分:5)
您不必在构建过程中解析组件。 Autofac 能够解决对象图依赖性。在您的情况下,CacheHelper
取决于ICacheRepository
,因此您只需注册CacheHelper
和ICacheRepository
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
范围。由于CacheHelper
为SingleInstance
,因此只会使用ICacheRepository
的单个实例,这可能会导致错误。有关详细信息,请参阅Captive Dependency。
在您的情况下,您似乎不需要这种注册。