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