使用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
你只需要注册CacheHelper
和ICacheRepository
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
范围是默认情况下将使用范围.因为CacheHelper
是SingleInstance
只的单个实例ICacheRepository
将被用于这可能导致到错误.有关详细信息,请参阅强制依赖性.
在您的情况下,您似乎不需要这种注册.
您不必在构建过程中解析组件.Autofac 能够解决对象图依赖性.在你的情况下CacheHelper
取决于ICacheRepository
你只需要注册CacheHelper
和ICacheRepository
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
范围是默认情况下将使用范围.因为CacheHelper
是SingleInstance
只的单个实例ICacheRepository
将被用于这可能导致到错误.有关详细信息,请参阅强制依赖性.
在您的情况下,您似乎不需要这种注册.