【问题标题】:Organizing methods for better accessing them组织方法以更好地访问它们
【发布时间】:2012-04-28 16:40:53
【问题描述】:

我正在尝试创建一个通用库,其中包含用于管理我们数据库中数据的所有方法。

这个库会有很多方法,所以我想让它更有条理。我希望它与以下语法一起使用。

db.setData().insertNewAccount(username, password);

db.modifyData().deleteAccount(username, password);

db.getData().getAccount();

如果我键入 setData,我将如何使它像这样工作,例如与 setData 相关的方法会显示出来。

【问题讨论】:

  • 请不要在标题前加上“C#”之类的前缀。这就是标签的用途。

标签: c#


【解决方案1】:

听起来你处理这个问题的方式是错误的 - 通常你会有一个类似于 AccountRepository 的类,其中包含与帐户相关的所有成员;那么您将拥有(比如说)一个 ArticleRepository 类,其中包含与文章相关的所有成员。

换句话说,按您正在处理的数据类型而不是您是否尝试获取、更新、插入等进行组织。

然后您可以使用依赖注入,这样每个业务类将只获得它使用的存储库。

【讨论】:

    【解决方案2】:

    如果你真的想这样做,那么你可以这样做(伪代码):

    class DataRepository
    {
        public SetDataHelper setData()
        { return new SetDataHelper(); }
    
        public ModifyDataHelper modifyData()
        { return new ModifyDataHelper(); }
    
        public GetDataHelper getData()
        { return new GetDataHelper(); }
    }
    
    class SetDataHelper
    {
        public void insertNewAccount(username, password) { ... }
    }
    
    class ModifyDataHelper
    {
        public void deleteAccount(username, password) { ... }
    }
    
    class GetDataHelper
    {
        public Account getAccount() { ... }
    }
    

    然后你可以按照自己的方式做,更流畅:

    var db = new DataRepository();
    
    db.setData().insertNewAccount(username, password);
    
    db.modifyData().deleteAccount(username, password);
    
    db.getData().getAccount();
    

    【讨论】:

    • 谢谢你,但是当你说“如果我真的想这样做”时,你的意思是有更好、更标准的代码组织方式吗?此类将有大约 60 个方法,如果我在对象名称后按点,则很难通过它们查看。
    • 当我写这行时,我想到了 Jon Skeet 的答案 =) 我也会为每个业务类创建一个存储库,而不是为每个 (CRUD) 操作创建一个类。但这适用于 =)
    • 我应该公开“class SetDataHelper”吗?当我尝试在不公开的情况下构建它时,我收到以下编译错误,说它不太容易访问。
    【解决方案3】:

    您可以创建具有不同功能的不同接口,并且您的类可以实现所有这些。然后,您的 setData() 可以返回类本身,并将其转换为相应的接口。例如:

    interface SetData {
      int insertNewAccount(A, B);
    }
    
    interface ModifyData {
      int deleteAccount(A, B);
    }
    
    interface GetData {
      int getAccount(A, B);
    }
    
    class DBHandler : SetData, ModifyData , GetData {
      //
      // Implement the interfaces...
      //
    
      // Returns the interfaces
      SetData setData(){ return (SetData)this; }
      ModifyData modifyData (){ return (ModifyData )this; }
      GetData getData (){ return (GetData )this; }
    }
    

    它可以满足您的需求,当然可以根据您的项目使用访问修饰符。而且此解决方案不会阻止您直接访问已实现的接口函数,这需要另一个类,或者代理所有对 DB 类的调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-08
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      • 2013-06-04
      相关资源
      最近更新 更多