使用autofac,两个装饰器模式有什么区别?

时间:2015-07-01 17:40:01

标签: c# dependency-injection autofac

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

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();

1 个答案:

答案 0 :(得分:0)

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

唯一的区别是第一个使用命名分辨率而第二个使用显式分辨率。使用第二个代码示例,如果要使用其他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"));