使用autofac,两种装饰器模式有什么不同

本文关键字:模式 什么 autofac 两种 使用 | 更新日期: 2023-09-27 18:00:37

上述两个注册之间有什么区别?

builder.RegisterDecorator<IHeaderMappingRepository>(
    (c, inner) => new CachedHeaderMappingRepository(inner), 
    fromKey: "headerMappingRepository");
builder.RegisterType<SqlHeaderMappingRepository>()
    .Named<IHeaderMappingRepository>("headerMappingRepository");

builder.Register(c => new CachedHeaderMappingRepository(
    c.Resolve<SqlHeaderMappingRepository>()))
    .As<IHeaderMappingRepository>();
builder.RegisterType<SqlHeaderMappingRepository>().AsSelf();

使用autofac,两种装饰器模式有什么不同

这两个代码示例非常相似。

唯一的区别是第一个使用命名分辨率,而第二个使用显式分辨率。在第二个代码示例中,如果您想使用另一个IHeaderMappingRepository实现,则必须更改适配器注册,而在另一种情况下,您必须更改名为的注册。

从功能上讲,以下两个注册是等效的。

builder.RegisterDecorator<IHeaderMappingRepository>(
                      (c, inner) => new CachedHeaderMappingRepository(inner), 
                      fromKey: "headerMappingRepository")
       .As<IHeaderMappingRepository>();
builder.RegisterType<SqlHeaderMappingRepository>()
       .Named<IHeaderMappingRepository>("headerMappingRepository");

builder.Register(c => new CachedHeaderMappingRepository(
                      c.ResolveNamed<IHeaderMappingRepository>("headerMappingRepository")))
       .As<IHeaderMappingRepository>();
builder.RegisterType<SqlHeaderMappingRepository>()
       .Named<IHeaderMappingRepository>("headerMappingRepository"));