我可以使用更通用的接口来简化我的类以使用命令模式吗?

时间:2012-04-06 10:15:30

标签: c# oop class design-patterns interface

我正在尝试创建一个应用程序我正在设计更通用的并在其中实现命令模式以使用管理器类来调用接口公开的方法。

我有几个课程,其中包含GetItem()GetList()方法,有些课程超载。当我尝试使用依赖注入时,它们接受不同的参数,并且它们返回不同的类型。以下是几个例子:

 class DatastoreHelper
    {
        public Datastore GetItem(string DatastoreName)
        {
            // return new Datastore(); from somewhere
        }
        public Datastore GetItem(int DatastoreID)
        {
            // return new Datastore(); from somewhere
        }
        public List<Datastore> GetList()
        {
           // return List<Datastore>(); from somewhere
        }
        public List<Datastore> GetList(HostSystem myHostSystem)
        {
           // return List<Datastore>(); from somewhere
        }

    }
    class HostSystemHelper
    {
        public HostSystem GetItem(int HostSystemID)
        {
          //  return new HostSystem(); from somewhere
        }
        public List<HostSystem> GetList(string ClusterName)
        {
            //return new List<HostSystem>(); from somewhere
        }
    }

我正在试图弄清楚我是否可以为这两种方法使用通用接口,以及一个有效成为控制器的管理器类。这样做会增加我的经理类的重用能力。

  interface IGetObjects
    {
        public object GetItem();
        public object GetList();
    }

class GetObjectsManager
{
    private IGetObjects mGetObject;
    public GetObjectsManager(IGetObjects GetObject)
    {
        this.mGetObject = GetObject;
    }
    public object GetItem()
    {
        return this.mGetObject.GetItem();
    }
    public object GetList()
    {
        return this.GetList();
    }
}

我知道我不得不放弃将参数传递给方法本身并使用类属性,但是我会失去依赖注入。我知道我必须将调用代码中的返回对象转换为它们应该是什么。所以我的帮助程序类看起来像这样:

class DatastoreHelper
{
    public string DatastoreName { get; set; }
    public string DatastoreID { get; set; }
    public object GetItem()
    {
        // return new Datastore(); from somewhere
    }
    public List<object> GetList()
    {
       // return List<Datastore>(); from somewhere
    }

}
class HostSystemHelper
{
    public int HostSystemID { get; set; }
    public string ClusterName {get; set;}
    public object GetItem()
    {
      //  return new HostSystem(); from somewhere
    }
    public List<object> GetList()
    {
        //return new List<HostSystem>(); from somewhere
    }
}

但上面是一个好主意还是我试图在某个不属于某个地方的模式?

编辑:我添加了一些更多的重载方法来说明我的类很复杂并且包含很多方法,有些方法根据不同的输入参数多次重载。

3 个答案:

答案 0 :(得分:2)

如果我理解这个概念,那么这样的设计是一个非常糟糕的主意:

class DatastoreHelper
{
    public string DatastoreName { get; set; }
    public string DatastoreID { get; set; }
    public object GetItem()
    {
        // return new Datastore(); from somewhere
    }
    public List<object> GetList()
    {
       // return List<Datastore>(); from somewhere
    }
}

原因是获得结果现在分为两个步骤:首先设置属性,然后调用方法。这提出了一系列问题:

  • 不直观(每个人都习惯于在方法调用中提供参数)
  • 将参数绑定从呼叫站点移开(被授予,这可能意味着“将它们移动到之前的LOC”,但仍然)
  • 不再明显哪种方法使用哪个属性值
  • 获取此对象的实例,只需添加几个线程即可获得即时消息

建议:

  1. 同时使IGetObjectsGetObjectsManager通用,这样您就不会失去类型安全性。这会使你失去多态地对待不同管理者的能力,但这有什么意义呢?每个管理器最终都专门针对特定类型的对象,除非您知道该类型是什么,否则您无法真正使用getter方法的返回值。那么,通过将管理者视为“未知经理”,你会获得什么收获?
  2. 考虑重写您的GetX方法以接受Expression<Func<T, bool>>而不是裸值。通过这种方式,您可以使用lambda谓词,这将使您的代码更加灵活,而不会丢失任何内容。例如:

    helper.GetItem(i => i.DataStoreID == 42);
    helper.GetList(i => i.DataStoreName.Contains("Foo"));
    

答案 1 :(得分:1)

这不是一个好主意。基于这些示例,您可以更好地使用不同返回类型和GetItem / GetList参数的通用接口。虽然老实说管理者很普遍,但是在多个地方使用一些模糊的东西,并试图将你的解决方案融入设计模式(而不是根据模式来定义解决方案),这对于我来说是更广泛的解决方案。

答案 2 :(得分:1)

第一个代码示例与Repository Pattern非常相似。我想这就是你想要应用的东西。最后一个样本并不好,Jon告诉你原因。然而,不要重新发明轮子,而是阅读一些关于存储库的信息(关于它的很多问题)因为,如果我理解正确,这就是你真正想要的。

关于重用,没有太多东西,特别是持久性接口是可重用的。有一个通用的存储库模式(我认为它是一个反模式)试图实现这一点,但实际上,所有的应用程序都需要相同的持久性接口吗?

作为一般准则,当您设计一个对象时,将其设计为满足特定的应用程序需求,如果碰巧重用它是一个奖励,但这不是对象的主要目的。