我想自动注册名称以“Service”结尾的所有接口,并且没有具体的实现要解析为生成的类型/代理(每个接口当然不同)。
所以,当我想解决IContractService
时,我希望它返回一个代理对象。我从这个article得到了这个想法,他们以某种方式与Castle Windsor一起实现了它。
实现这一目标的结构图方法是什么?我用自定义约定尝试了各种各样的东西,但我无法理解它。
答案 0 :(得分:0)
我通过使用Castle的动态代理和StructureMap约定来解决这个问题。 BTW。我还重命名了article中提到的一些类。
public class InfraRegistry : Registry
{
public InfraRegistry()
{
For<IClientProviderFactory>().Use<WcfClientProviderProviderFactory>();
Scan(scan =>
{
scan.AssemblyContainingType<MidleWareServiceConvention>();
scan.Convention<MidleWareServiceConvention>();
});
}
}
public class MidleWareServiceConvention : IRegistrationConvention
{
private readonly ProxyGenerator _proxyGen = new ProxyGenerator();
public void Process(Type type, Registry registry)
{
if (type.IsInterface && type.Name.EndsWith("Service", StringComparison.OrdinalIgnoreCase))
{
registry.For(type)
.HybridHttpOrThreadLocalScoped()
.Use(
context =>
_proxyGen.CreateInterfaceProxyWithoutTarget(type,
new WcfInterceptor(
context.GetInstance<IClientProviderFactory>())));
}
}
}