如何正确地将Dao类与业务逻辑类分离?

时间:2015-12-04 06:12:45

标签: android model dao abstraction greendao

我使用GreenDao在Android上处理我的Dao。 GreenDao使用Java Application自动生成所有Dao类。因此,您不想修改类,因为您的自定义代码将在下一次运行Java App时被覆盖。

这是我目前的分离方法,似乎很接近,但非常多余:

Dao模型(自动生成):

public class Car() {
  ...
  String mMake;
  String mModel;
  int mMilesDriven;
  ...

  public String getMake() {
    return mMake;
  }

  public String getModel() {  
    return mModel;  
  }

  public int getMilesDriven() {    
    return mMilesDriven;  
  }

}

业务逻辑类:

public class CarUtil() {

  Car mCar;

  public CarUtil(Car car) {
    mCar = car;
  }

  public String getName() {
    return mCar.getMake() + " " + mCar.getModel();
  }

  public int getMilesDriven() {
    return mCar.getMilesDriven();
  }

}

然而,显然这看起来非常多余,因为Car()是自动生成的,并且不能拥有正确的业务逻辑(例如将汽车名称的品牌和型号组合在一起),我认为它和&# #39;必要的冗余?

我相信我的模型实现了对数据层和业务逻辑层的良好抽象,但是如何在更少的代码中使其更高效?

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以将业务逻辑放入KEEP-SECTION - 块中。这些不会被覆盖。 (你必须告诉greendao发生器使用KEEP-SECTIONS。)

如果您不想公开某些生成的public方法,您还可以在生成的类上拥有一个接口,该接口只显示您想要的内容并在您的应用程序中使用该接口。

<强>更新

接口:

public interface CarUtil {
    String getName();
    int getMilesDriven();
}

实体(已生成);

public class Car() implements CarUtil {

    ...
    String mMake;
    String mModel;
    int mMilesDriven;
    ...

    public String getMake() {
        return mMake;
    }

    public String getModel() {  
        return mModel;  
    }

    public int getMilesDriven() {    
        return mMilesDriven;  
    }

    // KEEP-SECTION-START
    @Override
    public String getName() {
        return getMake() + " " + getModel();
    }
}

通常你只是使用界面,所以界面和其他公共方法都被隐藏了。

根据您的需要,最好包装生成的DAO(而不是实体),以便只有DAO层知道实际的实现。