2012-04-26 32 views
1

我有以下接口和它的实现:装饰现有登记在Autofac

public interface IService 
{ 
} 

public class Service1 : IService 
{ 
} 

public class DecoratedService 
{ 
    public DecoratedService(IService inner) 
    { 
    } 
} 

服务1登记在我不能更改代码(未命名注册):

builder.RegisterType<Service1>().As<IService>(); 

所以我需要用我自己的装饰这个注册。 Autofac.Module

类:我怎样才能在

公共类DataModule的范围性能的影响最小实现这一目标?

这是确定的,如果我需要改变现有的IService注册与一个名为(但我还没有找到如何做到这一点)。我在stackoverflow中研究了所有相关的问题,但其中没有一个给了我解决方案。

回答

1

您应该能够取代现有的登记IService您的模块中,并为其提供一个名称。

builder.RegisterType<Service1>().Named<IService>("implementor"); 

然后注册指定服务的装饰器。

builder.RegisterDecorator<IService>(s => new DecoratedService(s), "implementor"); 

Nick有一篇博客文章,详细介绍Autofac中的装饰器支持。

http://nblumhardt.com/2011/01/decorator-support-in-autofac-2-4/

+0

是的,这是一个有趣的想法。值得去尝试 – Pashec 2012-05-15 10:49:14