하드 코딩없이 Cake 패턴으로 의존성 공급을 어떻게합니까?
나는 방금 케이크 패턴 기사를 읽고 즐겼다 . 그러나 내 생각에 사용하는 구성 요소를 사용하는 주요 또는 이유 중 하나는 XML 파일에서 다양하게 할 수있는 것입니다.
DI의 유효성은 Cake 패턴으로 어떻게 처리 검증? 내가 본 모든 예는 특성을 정적으로 혼합하는 것과 관련이 있습니다.
특성 혼합은 Scala에서 정적으로 수행 개체에 혼합 된 특성을 변경 선택 일부 조건에 따라 다른 개체를 만듭니다.
표준 케이크 패턴을 생생하게 보겠습니다. 모듈은 특성으로 정의되고 애플리케이션은 여러 기능이 혼합 된 간단한 내부로 구성됩니다.
val application =
new Object
extends Communications
with Parsing
with Persistence
with Logging
with ProductionDataSource
application.startup
이제 모든 모듈에는 모듈이 있습니다. 정의됩니다. 모든 모듈에는 멋진 자체 유형이 존재하고 고유 한 모듈이 있습니다. 특히 Persistence 모듈에는 Persistence를 구현하는 모든 것이 추상 모듈 특성 인 DataSource도 구현해야한다는 자체 유형이 있습니다. ProductionDataSource는 DataSource에서 모든 것이 훌륭하며 해당 응용 프로그램 구성 라인이 있습니다.
그러나 테스트 목적으로 일부 데이터베이스를 로컬 데이터베이스를 사용하는 방법으로해야합니까? 또한 일부 속성 파일에서로드 된 다른 구성 변수를 사용하여 ProductionDataSource를 사용할 수 있습니다. 이 경우에 할 일은 DataSource를 확장하는 새로운 특성 TestDataSource를 정의하고 대신 혼합하는 것입니다. 명령 줄 플래그를 기반으로 동적으로 수행 할 수도 있습니다.
val application = if (test)
new Object
extends Communications
with Parsing
with Persistence
with Logging
with TestDataSource
else
new Object
extends Communications
with Parsing
with Persistence
with Logging
with ProductionDataSource
application.startup
이제 우리가 원하는 것보다 조금 더 장황 해 것. 특히 애플리케이션이 여러 축에서 구성을 변경해야하는 경우 더욱 그렇습니다. 플러스 같은 일반적으로 일반적으로 애플리케이션에서 이와 유사한 조건부 구성 번 논리 청크가 하나만 있으므로 (또는 잠재적 인 구성 요소 수명주기 당 최악의 경우), 즉 고통이 최소화되고 나머지 논리에서 차단됩니다.
Scala는 펼치기 언어이기도합니다. 따라서 구성 XML은 Scala 펼쳐집니다. 형식이 안전하고 다른 언어가 아닙니다.
시작을 꺼냅니다.
scala -cp first.jar:second.jar startupScript.scala
다음과 크게 다르지
java -cp first.jar:second.jar com.example.MyMainClass context.xml
항상 DI를 사용할 수 있습니다.
짧은 대답은 Scala는 현재 동적 믹스 인에 대한 지원이 내장되어 있지는 것입니다.
나는 지원하기 위해 위해 autoproxy-plugin을 작업하고, 컴파일러가 훨씬 더 쉬운 작업을 만드는 기능을 더 쉬운 2.9 릴리스까지 현재 보류 중입니다.
그 동안 거의 동일한 기능을 달성하는 가장 좋은 방법은 동적으로 추가 된 동작을 래퍼 클래스로 구현 한 다음 래핑 된 멤버에 암시 적 변환을 다시 추가하는 것입니다.
AutoProxy 플러그인을 사용할 수있을 때까지 효과를 얻을 수 있습니다.
trait Module {
def foo: Int
}
trait DelegatedModule extends Module {
var delegate: Module = _
def foo = delegate.foo
}
class Impl extends Module {
def foo = 1
}
// later
val composed: Module with ... with ... = new DelegatedModule with ... with ...
composed.delegate = choose() // choose is linear in the number of `Module` implementations
그러나 이것의 단점은 더 장황하다는 것 var
입니다. 그리고 트레이 트 안에서 s 를 사용한다면 초기화 순서에주의해야합니다 . 또 다른 단점은 Module
위에 경로 종속 유형이 있으면 위임을 쉽게 사용할 수 없다는 것입니다.
그러나 다양 할 수있는 다양한 구현이 많이있는 경우 가능한 모든 조합으로 케이스를 나열하는 것보다 코드 비용이 적게 듭니다.
Lift는 내장 된 라인을 따라 무언가를 가지고 있습니다. 대부분은 스칼라 코드에 있지만 런타임 제어가 있습니다. http://www.assembla.com/wiki/show/liftweb/Dependency_Injection
'ProgramingTip' 카테고리의 다른 글
StyleCop 규칙 위반 (0) | 2020.10.27 |
---|---|
가로 세로 맞춤으로 UIImageView 정렬 (0) | 2020.10.27 |
어떤 소멸자가 실행되고 (0) | 2020.10.27 |
C ++에서 부호있는 정수 오버플로가 여전히 정의되지 않은 동작입니까? (0) | 2020.10.27 |
한 단위가 hashCode-equals 계약을 어떻게 테스트해야합니까? (0) | 2020.10.27 |