gpt4 book ai didi

c# - CaSTLe Windsor 依赖注入(inject),基于客户的自定义实现

转载 作者:太空宇宙 更新时间:2023-11-03 15:27:22 25 4
gpt4 key购买 nike

我们有这样一种情况,我们使用 CaSTLe Windsor 依赖项注入(inject)将 IService 注入(inject)到 wep api Controller 中,如下所示:

public FooController : ApiController
{
private IService _service;

public FooController(IService service)
{
_service = service;
}
}

然后像这样注册服务:

 container.Register(Component.For<IService>().ImplementedBy<Service>().LifestyleTransient());

服务是这样的:

public Service : IService
{
public virtual string Logic()
{
return "Service Logic";
}
}

问题是,一些客户的业务逻辑与基础业务逻辑完全不同,因此我们需要使用另一种 Service 实现来满足客户的需求。

因此,如果有 2 个客户(Customer1 和 Customer2),Customer1 应该使用默认的 Service,但是 Customer2 应该使用一个名为 Customer2Service 的自定义实现,它将继承自 Service 并根据需要覆盖,如下所示:

public Customer2Service : Service
{
public override string Logic()
{
var response = base.Logic();

return "Customer 2 Logic " + response;
}
}

问题

  1. 首先,这看起来是解决客户特定代码这一特定问题的正确架构吗?
  2. 有没有办法使用依赖注入(inject)来解决这个问题? (我们不想要一个巨大的 switch 语句,它只是在每个操作中根据客户名称选择要使用的服务)

我们的尝试

我们尝试将依赖注入(inject)更改为基于属性,如下所示:

public FooController : ApiController
{
private IService _service;

public FooController()
{
}

public HttpResponseMessage FooAction(string customer)
{
_service = container.Resolve<IService>(customer);

...
}
}

container.Register(Component.For<IService>().ImplementedBy<Service>().LifestyleTransient());
container.Register(Component.For<IService>().ImplementedBy<Customer2Service>().LifestyleTransient().Named("Customer2"));

这样做的问题是,我们必须为每个客户提供定制服务,即使他们不需要,这会变得很笨重。否则解析会抛出一个异常,指出命名依赖项不存在。

最佳答案

你可以在这里使用工厂:

class ServiceFactory : IServiceFactory
{
public IService GetService(string customer)
{
switch (customer)
{
case "special":
return container.Resolve<IService>("special");
default:
return container.Resolve<IService>("default");
}
}
}

然后您可以将工厂注入(inject)到您的 Controller 中,并从工厂获取 IService。在 switch 语句中,您只声明特殊情况,所有其他情况都交给 default 子句。

关于c# - CaSTLe Windsor 依赖注入(inject),基于客户的自定义实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34755115/

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