gpt4 book ai didi

c# - 如何在 autofac 中混合装饰器?

转载 作者:太空狗 更新时间:2023-10-29 23:57:17 26 4
gpt4 key购买 nike

我希望能够将装饰器与 Autofac 混合搭配。

例如,假设我有一个 IRepository 接口(interface),由 Repository 类实现。
我可以有以下装饰器:RepositoryLocalCache、RepositoryDistributedCache、RepositorySecurity、RepositoryLogging...,你明白了。

基于配置设置,我想用所需的装饰器装饰基本实现。这可以是无、一个或多个装饰器。

我熟悉注册一个装饰器或按固定顺序注册一系列装饰器的语法,但如何才能使其动态化?

最佳答案

正如史蒂文在上面指出的那样,RegisterDecorator Autofac 中的方法并不是真正为这种情况设计的,而且使用起来非常笨拙。它们是为某些使用常规 Autofac 注册难以实现的情况而构建的——“ native ”方法要简洁得多。

例如,IFoo是服务和Impl是具体的(例如存储库)实现。

interface IFoo { }

class Impl : IFoo { }

class DecoratorA : IFoo
{
public DecoratorA(IFoo decorated) { }
}

class DecoratorB : IFoo
{
public DecoratorB(IFoo decorated) { }
}

首先使用具体类型注册所有组件:

var builder = new ContainerBuilder();

builder.RegisterType<Impl>();
builder.RegisterType<DecoratorA>();
builder.RegisterType<DecoratorB>();

Lambda 注册也很好,只要确保它们使用As<IFoo>()即可.

现在一个包装器将它们链接起来以提供完全配置的服务:

bool useA = true, useB = false;

builder.Register(c =>
{
IFoo result = c.Resolve<Impl>();

if (useA)
result = c.Resolve<DecoratorA>(TypedParameter.From(result));

if (useB)
result = c.Resolve<DecoratorB>(TypedParameter.From(result));

return result;
}).As<IFoo>();

useAuseB是您从配置中动态提供的值。

现在解决(或依赖)IFoo将为您提供动态构造的装饰器链。

using (var container = builder.Build())
{
var foo = container.Resolve<IFoo>();

如果您使用的是泛型,事情就比较棘手了,因为您没有提及它们,所以我不会深入探讨,但如果您使用了泛型,那么请提出另一个问题。

关于c# - 如何在 autofac 中混合装饰器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23406641/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com