Fasada, architektura heksagonalna i Kotlin

0

Jeszcze jedno pytanie z Kotlina. Czy da się w jakiś sposób zaimplementować odpowiednik czegoś takiego w Javie?

public class BookFacade {
    private final BookService bookService;
    //constructor
}

@Service
class BookService {
    
}

Czyli zamknięcie danego modułu - heksa w jednym pakiecie i wystawienie jedynie publicznej fasady i dto?
Z tego co widzę to internal w ten sposób nie działa - kompilator krzyczy że nie mogę czegoś takiego zrobić

class BookFacade(private val bookService: BookService) {
}

@Service
internal class BookService {    
}

Zastanawiam się więć w jaki sposób w ogóle wykorzystać internal? Oraz czy powyższy case można jakoś inaczej zaimplementować w Kotlinie?

Edit#
chodzi o coś takiego, jeżeli nie jasno to opisałem

1

Nie do końca rozumiem jak Ci kompilator krzyczy na internal.
U mnie działa. Aczkolwiek to nie do końca pewnie to czego szukasz.

internal to taki public - ale tylko w ramach modułu.
Zamiast pokietów rozdzielasz projekt na moduły (gradle), w ramach których oczywiście możesz mieć wiele pakietów.

Teraz wszystko to co jest wewnętrzne dla modułu oznaczasz jaki internal, a to co ma być eksportowane poza
jako public. Jest to dość podobne do filozofii modułów w java 9.
I ogólnie dużo fajniejsze niż package w javie (do szału doprowadza mnie brak dostępu w podpakietach).
Dodatkowy narzut biurokratyczny związany z modułem w gradle jest zwykle bardzo mały (zaleta gradle).

Btw. nie jestem pewny czy to działa ze Springiem (imo powinno, ale nie zdziwiłoby mnie gdyby był jakiś problem).

1

screenshot-20201206165107.png

Działa dopiero coś takiego

@Service
class BookFacade() {
    @Autowired
    private lateinit var bookService: BookService
}

Albo

@Service
class BookFacade() {
    private val bookService: BookService = BookService()
}
0

No masz publiczna klase ze wstrzykiwana przez konstruktor zaleznoscia. No to ta zaleznosc musi byc widoczna na zewnatrz, tak? (bo inaczej jak ja niby podasz w argumencie?)

Byc moze chcesz miec internal constructor?

0

Chyba mam to o co mi chodziło, faktycznie internal constructor załatwia sprawę. Innej opcji chyba nie ma?

@Configuration
class BookConfiguration {
    @Bean
    fun bookFacade(bookRepository: BookRepository) = BookFacade(BookService(bookRepository))
}

class BookFacade() {
    private lateinit var bookService: BookService
    
    internal constructor(bookService: BookService) : this() {
        this.bookService = bookService
    }
}

@Service
internal class BookService(private val bookRepository: BookRepository) {}

interface BookRepository {
    fun findAll(): Book
}
2

Ale nie tak :D
(Znaczy tak tez mozna jesli potrzebujesz kilku konstruktorow.)
Mozna krocej:

class BookFacade internal constructor(private val bookService: BookService) {
}
0

@AngryProgrammer: ogarnij sobie najpierw podstawy Kotlina, dopiero potem jakieś heksagony. W Springu wstrzykujesz (mam nadzieje) przez konstruktor, to dlaczego teraz jakieś cuda z polami?

3

Jak chcesz robić hexagonalną w kotlinie to zamiast pakietów używaj modułów, łatwiej i przyjemniej

1 użytkowników online, w tym zalogowanych: 0, gości: 1