Skip to content

Commit 3e17faa

Browse files
authored
[NL-13] : DIInjector 구현 (#11)
* [NL-13] : DIInjector 구현 - Property Wrapper 이용해서 Injected 될 수 있도록 구현 * [NL-13] : - refactor - register시 object 등록하지 않고 클로저를 받도록 수정 - 인스턴스 생성 시점 register -> resolve
1 parent 1dd81ff commit 3e17faa

File tree

5 files changed

+108
-0
lines changed

5 files changed

+108
-0
lines changed
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
//
2+
// DependencyInjector.swift
3+
// CoreLayer
4+
//
5+
// Created by 최재혁 on 7/21/25.
6+
//
7+
8+
import Foundation
9+
import Swinject
10+
11+
@propertyWrapper
12+
public final class Injected<T> {
13+
public let wrappedValue : T
14+
15+
public init() {
16+
self.wrappedValue = DependencyInjector.shared.resolve(T.self)
17+
}
18+
}
19+
20+
// DI 대상 등록
21+
public protocol DependencyAssemblable {
22+
func assemble(_ assemblyList: [Assembly])
23+
func register<T>(_ serviceType : T.Type, factory: @escaping (Resolver) -> T)
24+
}
25+
26+
// DI 등록한 서비스 사용
27+
public protocol DependencyResolvable {
28+
func resolve<T>(_ serviceType : T.Type) -> T
29+
}
30+
31+
public typealias Injector = DependencyAssemblable & DependencyResolvable
32+
33+
public final class DependencyInjector : Injector {
34+
private let container : Container = Container()
35+
36+
public static let shared = DependencyInjector()
37+
38+
private init() { }
39+
40+
public func assemble(_ assemblyList: [any Assembly]) {
41+
assemblyList.forEach {
42+
$0.assemble(container: container)
43+
}
44+
}
45+
46+
public func register<T>(_ serviceType: T.Type, factory : @escaping (Resolver) -> T) {
47+
container.register(serviceType, factory: factory)
48+
}
49+
50+
public func resolve<T>(_ serviceType: T.Type) -> T {
51+
container.resolve(serviceType)!
52+
}
53+
}

Core/DIInjector/Sources/empty.swift

Whitespace-only changes.
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
//
2+
// DependencyInjectorTest.swift
3+
// DITest
4+
//
5+
// Created by 최재혁 on 7/21/25.
6+
//
7+
8+
import Testing
9+
import Swinject
10+
import DIInjector
11+
12+
struct DependencyInjectorTest {
13+
14+
init() async throws {
15+
DependencyInjector.shared.assemble([
16+
MockAssembly()
17+
])}
18+
19+
@Test func dependencyTest() {
20+
@Injected var mockClass : MockClass
21+
#expect(mockClass.mockFunc())
22+
}
23+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
//
2+
// MockData.swift
3+
// CoreLayer
4+
//
5+
// Created by 최재혁 on 7/21/25.
6+
//
7+
8+
import Swinject
9+
10+
public class MockClass {
11+
func mockFunc() -> Bool {
12+
print("MockClass Registered")
13+
return true
14+
}
15+
}
16+
17+
public struct MockAssembly : Assembly {
18+
public func assemble(container: Container) {
19+
container.register(MockClass.self) { _ in
20+
return MockClass()
21+
}
22+
}
23+
}

Core/Project.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,15 @@ struct CoreLayer: Layer {
2626
dependencies: [
2727
.external(name: "Swinject")
2828
]
29+
),
30+
.createTarget(
31+
name: "DITest",
32+
product: .unitTests,
33+
sources: ["DIInjector/Test/Sources/**"],
34+
dependencies: [
35+
.target(name: "DIInjector"),
36+
37+
]
2938
)
3039
]
3140
}

0 commit comments

Comments
 (0)