如何正确分离 Dao Class 和 Business Logic Class?

How to Correctly Separate Dao Class from Business Logic Class?

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

这是我目前的分离方法,看起来很接近,但很多余:

道模型(自动生成):

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

  public String getMake() {
    return mMake;
  }

  public String getModel() {  
    return mModel;  
  }

  public int getMilesDriven() {    
    return mMilesDriven;  
  }

}

业务逻辑Class:

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() 是自动生成的并且没有正确的业务逻辑(例如结合汽车名称的品牌和型号),我认为这是必要的冗余吗?

我相信我的模型实现了数据层和业务逻辑层的良好抽象,但我怎样才能用更少的代码使其更高效?

谢谢!

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

如果您不想公开某些生成的 public 方法,您还可以在生成的 class 上有一个接口,它只公开您想要的东西并在您的应用程序中使用该接口.

更新

接口:

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();
    }
}

所以通常你只使用接口,所以接口和其他 public 方法都是隐藏的。

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