如何在C#中重用单例对象的代码

时间:2015-10-01 08:17:01

标签: c# inheritance static singleton

我的项目设计课时遇到了麻烦。目前,我们开发了两个结构相同但内部存在差异的项目。

在项目A中,我的课程ACore包含class AConfiguration, AEquipmentManager。我为对象ACore创建了一个实例,在项目的任何地方,我都可以使用:Acore.AConfiguration.XYZ(XYZ是AConfiguration类的方法或属性)或ACore.AEquipmentmanager.ABC(ABC是AEquipmentManager类的方法或属性

在项目B,我仍然与项目A(BCore, BConfiguration, BEquipmentManager)具有相同的结构。但BConfigurationAConfiguration不同(因为每个项目都有不同的配置),而BEquipmentManagerAEquipmentManager也有所不同。

我想重用类ACoreBCore的代码,因为它们具有相同的代码(Initialize EquipmentManager,Initialize Configuration,Dispose EquipmentManager,Dispose Configuration,...)。现在,我想编写一个与BaseCoreACore具有相同结构的库BCore(有2个类ConfigurationEquipmentManager,同样的Intialize函数,Dispose函数),以及特定项目(如A项目,B项目,甚至更晚的C,D项目)我可以使用BaseCore库类(用于重用代码)并只实现XEquipmentManager,{ {1}}取决于每个项目。

在这种情况下,我应该设计的最佳方式是什么?感谢分享您的想法。

此致 Hoa Nguyen

2 个答案:

答案 0 :(得分:0)

我认为你走在正确的轨道上,

但我会用接口来做:

  • 实现使用实现IConfigurable的类的Core类。

  • 确保AConfiguration实现IConfigurable和所有 相关方法。

另外,你可以这样做:

  • 实现使用Configuration类的Core类。

  • 实施继承自
    的AConfiguration / BConfiguration 配置。

  • 将A和B引用到同一个Core类,就是这样。

希望它有所帮助。

答案 1 :(得分:0)

AConfiguration和BConfiguration是否具有不同实现的相同方法集,或者set方法是否也有所不同?如果方法集相同,则可以使用接口来完成。您可以为配置和设备管理器定义接口。然后你只需使用BaseCore这些界面。然后你可以在BaseCore的构造中提供具体的实现这样的东西(省略单例的东西)

interface IConfiguration
{ 
    void somefunc();
}

interface IEquipmentManager
{
    void someOtherFunc();
}

class BaseCore
{
   private IConfiguration conf;
   private IEquipmentmanager eq;
   private BaseCore(){};

   public BaseCore(IConfiguration inConf, IEquipmentmanager inEq) :
          conf(inConf), eq(inEq)
  {
    conf.someFunc();
  }

}

class AConfiguration : IConfiguration
{
   public void someFunc()
   {
        do stuff!
   }

   public int intprop{get;set;}
}

class AEquipmentmanager : IEquipmentmanager
{
   public void someOtherFunc()
   {
        do stuff!
   }
}

请注意,您必须初始化AConfiguration和AEquipmentmanager的实例。在像BaseCore这样构建之前

AConfiguration conf = new AConfiguration();
AEquipmentmanager   eq   = new AEquipmentmanager();
BaseCore base = new BaseCore(conf eq);

或者你可以简单地创建一个BaseCore构造函数,它接受一些枚举来表示你的实现,然后在BaseCore构造函数中初始化相应类的实例。

或者你可以通过实现BaseCore with Generic参数来实现它,并通过这些参数提供配置和设备管理器实现。您仍然可以使用相同的接口,但实现BaseCore对Generic参数的限制。 BaseCore看起来像这样:

class BaseCore<Configuration_type,Equipmentmanager_type>  
               where Configuration_type : IConfiguration, new() 
               where Equipmentmanager_type : IEquipmentmanager, new()
{
   public Configuration_type Configuration {get;};
   public Equipmentmanager_type Equipmentmanager {get;};

   BaseCore()
   {
      Configuration = new Configuration_type();
      Equipmentmanager   = new Equipmentmanager_type();
   }
}
然而,

这会将约束放在他们需要无参数构造函数的类型上。据说可以在之后进行初始化。

如果您想为特定配置专门化您的核心,您可以像这样继承它

class Acore<Configuration_type,Equipmentmanager_type> :
BaseCore<Configuration_type,Equipmentmanager_type> 
    where Configuration_type : AConfiguration ,new()
    where Equipmentmanager_type : AEquipmentmanager, new()
{
    Acore() : base()
    {
        Configuration.intprop = 10;
    }

}

请注意,我在AConfiguration上添加了一个在BaseCore中无法访问但在ACore中的属性