How to alter the design so that entities don't use injections?

后端 未结 4 1553
没有蜡笔的小新
没有蜡笔的小新 2021-01-18 00:19

I\'ve read and came to realize myself that entities (data objects - for JPA or serialization) with injections in them is a bad idea. Here is my current design (all appropria

4条回答
  •  佛祖请我去吃肉
    2021-01-18 00:36

    What is the entry point? Is this a web application, a rest service, a soap service, or event a scheduler?

    Injection frameworks almost always separate data and service. Data are always POJO, containing absolutely no business logic. Here, assuming this is a rest-service, i will do the following:

    public class SSOApplication {
    
        public class State implements Serializable {
    
            List cars = new ArrayList<>();
    
            List planes = new ArrayList<>();
    
            // other objects similar to AbstractPlane as shown below
        }
    
        public abstract class AbstractPlane implements Serializable {
    
            long serialNumber;
        }
    
        public class PropellorPlane extends AbstractPlane {
    
            int propellors;
        }
    
        public class EnginePlane extends AbstractPlane {
    
            List engines = new ArrayList<>(); // Engine is another pojo
        }
    
        public abstract class AbstractCar implements Serializable {
    
            long serialNumber;
    
            abstract CarData getData();
    
        }
    
        public static class CarData {
    
            String type;
            int year;
        }
    
        public class Car2Data extends CarData {
    
            char property2;
    
            {
                type = "car2";
                year = 12;
            }
        }
    
        public static class Car1Data extends CarData {
    
            int property1;
    
            {
                type = "car1";
                year = 1;
            }
        }
    
        public static class Car1 extends AbstractCar {
    
            @Override
            CarData getData() {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }
    
        }
    
        public static class Car2 extends AbstractCar {
    
            @Override
            CarData getData() {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }
    
        }
    
        public static interface CarManager {
    
            void operate(T car, int index);
    
            default boolean canHandle(T carData) {
                final TypeToken token = new TypeToken(getClass()) {
                };
    
                return token.getType() == carData.getClass();
            }
        }
    
        @ApplicationScoped
        public static class Car1Manager implements CarManager {
    
            public void operate(Car1Data car, int index) {
            }
        }
    
        @ApplicationScoped
        public static class Car2Manager implements CarManager {
    
            public void operate(Car2Data car, int index) {
            }
        }
    
        @ApplicationScoped
        public static class CarService {
    
            @Any
            @Inject
            private Instance> carManagers;
    
            public void operate(int index, AbstractCar car) {
                final CarData carData = car.getData();
                final CarManager carManager = carManagers.stream()
                        .filter((mng) -> mng.canHandle(carData))
                        .findFirst()
                        .orElse(IllegalArgumentException::new);
    
                carManager.operate(carData, index);
            }
        }
    }
    

提交回复
热议问题