【问题标题】:Generic Class Lists used with Strategy Pattern与策略模式一起使用的通用类列表
【发布时间】:2020-02-26 14:04:05
【问题描述】:

我想在 Asp.net 中使用具有策略模式的泛型类以及依赖注入

接口和具体类的定义

public interface IPaymentMethod<T> 
{
   string Name { get; set }
}

public interface PaymentMethod<T> : IPaymentMethod<T> where T: class 
{ 
   public string Name { get; set; }
}

Startup.cs

services.AddScoped(typeof(IPaymentMethod<>), typeof(PaymentMethod<>));

在应用程序中

public class PaymentResolver 
{
    public PaymentResolver(List<IPaymentMethod<????>> paymentMethods) 
    { ... }

    public IPaymentMethod Resolve(string name)
    {
        return _paymentMethods.FirstOrDefault(item => item.Name == name);
    }
}

如何从依赖注入中获取 IPaymentMethod 实例的集合? PaymentResolver.Resolve 方法似乎不正确。

【问题讨论】:

  • 你不能有一个泛型类型的列表,即使不考虑 DI。
  • T 中的IPaymentMethod&lt;T&gt; 代表什么?请使用有关您的设计的更多信息更新您的问题。 T 是什么?你为什么需要它?你是怎么用的?
  • Steven,更多的是学习如何使用具有策略模式的通用类列表,而不是示例的上下文。 T 可以代表任何东西,不受这个基本示例的约束
  • 你没有具体的类。 IPaymentMethodPaymentMethod 都被标记为接口。

标签: c# asp.net generics dependency-injection strategy-pattern


【解决方案1】:

你正在寻找的是与你自己的冲突。所以基本上,当您知道服务名称时,您想获得服务。那么,我的问题是你是否知道服务名称

_paymentResolver.GetPaymentMethod("CreditCard/DebitCard")

你也必须知道服务类型

class Invoice
{
 public Invoice(IPaymentMethod<CreditCard> cc, IPaymentMethod<DeditCard> dc) {}
}

那么是什么阻止您使用类型而不是名称呢?更不用说它为您提供强类型输入,因此您不会有错误输入名称的风险。

希望这可以帮助您理清思路。

【讨论】:

  • 是的,这种方式是可行的,但如果你有几十种类型的 IPaymentMethod 可能很难管理,而收集更容易。似乎没有办法这样做
  • 嗨@Melih,这是真的。但是,有一种方法可以使代码更好一些。如果您可以使用 Autofac (autofaccn.readthedocs.io/en/latest/advanced/…) 的聚合服务。您可以将所有允许的支付服务分组为一项服务。 .net core 还没有这个功能,但您可以轻松复制此功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 2018-02-27
相关资源
最近更新 更多