Ninject工厂是否符合开放/封闭原则?

时间:2015-12-22 13:15:59

标签: c# ninject

我正在寻找创建符合开放/封闭标准的工厂的解决方案。 我们可以通过反射实现它非常简单(实例化实现特定接口的所有类,存在于当前程序集中,使用基于静态属性的键将它们存储在某些字典中,并根据传递给CreateInstance方法的参数返回特定实例)。

我想知道使用Ninject是否可行。 我买了书"掌握Ninject for Dependency Injection"有一章"满足现实世界的要求"与Telcom Switch示例。 不幸的是,IStatusCollectorFactory和实现此接口的所有工厂都违反了Open / Close原则 - 如果要添加对新类的支持,则必须更改接口。

任何帮助?:)

/// Interface for classes that define factory able to create currency defaltion instances. 
public interface ICurrencyDeflationFactory
{
    ICurrencyDeflation CreateInstance(string currencyCode);
}


/// <summary>
/// Interface for classes that define deflation table in specific currency.
/// </summary>
public interface ICurrencyDeflation
{
    /// <summary>
    /// Current currency code as defined in ISO 4217
    /// </summary>
    string CurrencyCode { get; }

    /// <summary>
    /// Deflation table used during conversion.
    /// </summary>
    string[,] GetDeflationTable { get; }
}

1 个答案:

答案 0 :(得分:1)

感谢您的反馈。我设法实现我想要的(在我看来:) :)这是一个潜在的解决方案: 内核注册:

kernel.Bind<ICurrencyDeflationFactory>().To<CurrencyDeflationFactory>(); 
kernel.Bind(x => x.FromAssemblyContaining<ICurrencyDeflation>()
  .SelectAllClasses()
  .InheritedFrom<ICurrencyDeflation>()
  .BindAllInterfaces());

工厂界面:

/// <summary>
/// Interface for classes that define factory able to create currency defaltion instances.
/// </summary>
public interface ICurrencyDeflationFactory
{
    List<ICurrencyDeflation> CurrencyList { get; }
    ICurrencyDeflation CreateInstance(string currencyCode);
}

通货紧缩界面:

    /// <summary>
/// Interface for classes that define deflation table in specific currency.
/// </summary>
public interface ICurrencyDeflation
{
    /// <summary>
    /// Current currency code as stands in ISO 4217
    /// </summary>
    string CurrencyCode { get; }

    /// <summary>
    /// Deflation table used during conversion.
    /// </summary>
    string[,] GetDeflationTable { get; }
}

工厂混凝土:

public class CurrencyDeflationFactory : ICurrencyDeflationFactory
{ 
    List<ICurrencyDeflation> deflationCollection;
    public CurrencyDeflationFactory(List<ICurrencyDeflation> definedDeflations)
    {
        this.deflationCollection = definedDeflations;
    }
    public List<ICurrencyDeflation> CurrencyList
    {
        get
        {
            return deflationCollection;
        }
    }

    public ICurrencyDeflation CreateInstance(string currencyCode)
    {
        return deflationCollection.Find(x => x.CurrencyCode.Equals(currencyCode));
    }
}

为了让美元通缩:

 var currencyDeflation = kernel.Get<ICurrencyDeflationFactory>().CreateInstance("USD");

因此,我不必: 1)改变主程序向内核注册新类
2)新的通货紧缩只是一个实现IDeflationCurrency的新类 3)每个实现IDeflationCurrency的类都将在运行时可用,无需更改现有代码(关闭以进行修改) 4)如果需要,我可以在不触及现有代码的情况下添加新的通货紧缩(打开扩展名)