使用命名参数解析服务

时间:2015-05-13 12:55:10

标签: autofac

我遇到的问题是解析使用命名参数注册的服务导致错误的解决方案:

注册就是这样:

builder.RegisterType<CviStaticCacheManager>()
            .As<ICacheManager>()
            .Named<ICacheManager>(STATIC_CACHE)
            .SingleInstance();

builder.RegisterType<CviRequestCacheManager>()
            .As<ICacheManager>()
            .Named<ICacheManager>(REQUEST_CACHE)
            .InstancePerLifetimeScope();

如果我解决了这样注册的服务,那么一切正常:

builder.RegisterType<PermissionService>().As<IPermissionService>()
            .WithParameter(ResolvedParameter.ForNamed<ICacheManager>(STATIC_CACHE))
            .InstancePerLifetimeScope();

我的问题是我有一些注册,我无法修改解析服务(我不能使用ResolveKeyed / ResolveNamed!):

var cm = AutofacDependencyResolver.Current.RequestLifetimeScope.Resolve<ICacheManager>()

现在我总是得到一个CviStaticCacheManager的实例 - 无论我注册它的顺序都无关紧要。

我试图在一个模块中解决这个问题 - 但后来我总是得到CviRequestCacheManager:

    protected override void AttachToComponentRegistration(IComponentRegistry registry, IComponentRegistration registration)
    {
        registration.Preparing += OnComponentPreparing;
    }

    private static void OnComponentPreparing(object sender, PreparingEventArgs e)
    {
        e.Parameters = e.Parameters.Union(
            new[]
            {
                new ResolvedParameter(
                    (p, i) => p.ParameterType == typeof (ICacheManager),
                    (p, i) => i.ResolveKeyed<ICacheManager>(REQUEST_CACHE))
            });
    }

我真的很沮丧,我正在寻找解决方案。也许有人可以帮助我。

最诚挚的问候 约尔格

1 个答案:

答案 0 :(得分:0)

评论后

//app.UseAutofacMiddleware(container);
//app.UseAutofacMvc();
它突然起作用了。 我目前不需要owin集成 - 但是如果我启用调用 app.UseAutofacMvc();

,我真的不知道为什么注册组件的顺序会受到影响

此致 约尔格