Skip to content

Commit 90b36b2

Browse files
committed
ModuleScanner를 통해 생성한 Module에서 Instance를 캡처하여 재사용되던 문제 수정
1 parent 8be7e33 commit 90b36b2

File tree

6 files changed

+150
-114
lines changed

6 files changed

+150
-114
lines changed

Sources/DIContainer/Module/AutoModule.swift

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ import Foundation
22

33
open class AutoModuleBase {
44
public required init() {}
5+
6+
fileprivate func __newInstance() -> Self {
7+
Self()
8+
}
59
}
610

711
public protocol AutoModulable: AnyObject {
@@ -11,10 +15,17 @@ public protocol AutoModulable: AnyObject {
1115
public typealias AutoModule = AutoModuleBase & AutoModulable
1216

1317
#if DEBUG
14-
public extension AutoModulable {
18+
extension AutoModulable {
1519
var module: Module? {
16-
(self as? ModuleKeyType.Value)
17-
.map { instance in Module(ModuleKeyType.self) { instance } }
20+
guard
21+
let instance = self as? ModuleKeyType.Value,
22+
let autoModuleBase = instance as? AutoModuleBase
23+
else { return nil }
24+
25+
return Module(ModuleKeyType.self) {
26+
(autoModuleBase.__newInstance() as? ModuleKeyType.Value)
27+
?? instance
28+
}
1829
}
1930
}
2031
#endif

Tests/DIContainerTests/Tests/CachedModuleTests.swift renamed to Tests/DIContainerTests/Tests/AutoModuleIsNotCachedTests.swift

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//
2-
// CachedModuleTests.swift
2+
// AutoModuleIsNotCachedTests.swift
33
// DIContainer
44
//
55
// Created by minsOne on 1/23/25.
@@ -11,29 +11,27 @@ import Testing
1111

1212
@MainActor
1313
@Suite(.serialized)
14-
struct CachedModuleTests {
14+
struct AutoModuleIsNotCachedTests {
1515
init() {
1616
Container.autoRegisterModules()
1717
}
1818
}
1919

20-
extension CachedModuleTests {
20+
extension AutoModuleIsNotCachedTests {
2121
@Test
22-
func cachedModule() throws {
23-
let service1 = getMockService()
24-
let service2 = getMockService()
22+
func scannedModule() throws {
23+
let _service1 = getMockService()
24+
let _service2 = getMockService()
2525

26-
service1.doSomething()
27-
do {
28-
let service = try #require(service1 as? MockServiceImpl)
29-
#expect(service.count == 1)
30-
}
26+
_service1.doSomething()
27+
let service1 = try #require(_service1 as? MockServiceImpl)
28+
#expect(service1.count == 1)
3129

32-
service2.doSomething()
33-
do {
34-
let service = try #require(service2 as? MockServiceImpl)
35-
#expect(service.count == 2)
36-
}
30+
_service2.doSomething()
31+
let service2 = try #require(_service2 as? MockServiceImpl)
32+
#expect(service2.count == 1)
33+
34+
#expect((service1 === service2) == false)
3735
}
3836

3937
@Test
@@ -48,18 +46,18 @@ extension CachedModuleTests {
4846
let service = try #require(service1 as? MockServiceImpl)
4947
#expect(service.count == 1)
5048
}
51-
49+
5250
let service2 = factory2.makeService()
5351
service2.doSomething()
54-
52+
5553
do {
5654
let service = try #require(service2 as? MockServiceImpl)
5755
#expect(service.count == 1)
5856
}
5957
}
6058
}
6159

62-
extension CachedModuleTests {
60+
private extension AutoModuleIsNotCachedTests {
6361
func getMockService() -> MockService {
6462
@Inject(MockServiceKey.self) var service
6563
return service

Tests/DIContainerTests/Tests/InjectTestsTests.swift renamed to Tests/DIContainerTests/Tests/Inject/InjectTestsTests.swift

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,13 @@ extension ContainerTests {
3636
}
3737

3838
private func injectBehavior() {
39-
@Inject(MockServiceKey.self) var service: MockService
40-
service.doSomething()
41-
#expect((service as? MockServiceImpl)?.count == 1)
39+
@Inject(MockServiceKey.self) var service1: MockService
40+
service1.doSomething()
41+
service1.doSomething()
42+
#expect((service1 as? MockServiceImpl)?.count == 2)
43+
44+
@Inject(MockServiceKey.self) var service2: MockService
45+
service2.doSomething()
46+
#expect((service2 as? MockServiceImpl)?.count == 1)
4247
}
4348
}

Tests/DIContainerTests/Tests/WeakInjectNilTests.swift renamed to Tests/DIContainerTests/Tests/Inject/WeakInjectNilTests.swift

File renamed without changes.
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
import Testing
2+
import XCTest
3+
4+
@testable import DIContainer
5+
6+
@MainActor
7+
@Suite(.serialized)
8+
struct WeakInjectTest {
9+
init() {
10+
// Given
11+
Container {
12+
Module(WeakMockServiceKey.self) { WeakMockServiceImpl() }
13+
Module(MockServiceImpl.self)
14+
Module(MockServiceFactoryKey.self) { MockServiceFactory() }
15+
}
16+
.build()
17+
}
18+
}
19+
20+
extension WeakInjectTest {
21+
@Test
22+
func containerRegistration1() {
23+
// When
24+
let weakMockService = WeakMockServiceKey.module?.resolve()
25+
let weakMockServiceImpl = WeakMockServiceKey.module?.resolve() as? WeakMockServiceKey.Value
26+
let weakMockServiceProtocol = WeakMockServiceKey.module?.resolve() as? WeakMockService
27+
28+
// Then
29+
#expect(weakMockService != nil)
30+
#expect(weakMockServiceImpl != nil)
31+
#expect(weakMockServiceProtocol != nil)
32+
}
33+
34+
@Test
35+
func containerRegistration2() throws {
36+
// When
37+
@WeakInject(WeakMockServiceKey.self) var service1
38+
@WeakInject(MockServiceKey.self) var service2
39+
@WeakInject(MockServiceFactoryKey.self) var factory
40+
41+
// Then
42+
#expect(service1 != nil)
43+
#expect(service2 != nil)
44+
#expect(factory != nil)
45+
}
46+
47+
@Test
48+
func weakInjectBehavior1() throws {
49+
// When
50+
@WeakInject(WeakMockServiceKey.self) var _service1: WeakMockService?
51+
@WeakInject(MockServiceKey.self) var _service2: MockService?
52+
@WeakInject(WeakMockServiceKey.self) var _service3: WeakMockService?
53+
54+
// Then
55+
let service1 = try #require(_service1)
56+
service1.doSomething()
57+
service1.doSomething()
58+
#expect((service1 as? WeakMockServiceImpl)?.count == 2)
59+
60+
let service2 = try #require(_service2)
61+
service2.doSomething()
62+
service2.doSomething()
63+
#expect((service2 as? MockServiceImpl)?.count == 2)
64+
65+
let service3 = try #require(_service3)
66+
service3.doSomething()
67+
service3.doSomething()
68+
#expect((service3 as? WeakMockServiceImpl)?.count == 2)
69+
}
70+
71+
@Test
72+
func weakInjectBehavior2() throws {
73+
// When
74+
@WeakInject(WeakMockServiceKey.self) var _service1
75+
@WeakInject(MockServiceKey.self) var _service2
76+
@WeakInject(MockServiceKey.self) var _service3
77+
78+
// Then
79+
let service1 = try #require(_service1)
80+
service1.doSomething()
81+
service1.doSomething()
82+
#expect((service1 as? WeakMockServiceImpl)?.count == 2)
83+
84+
let service2 = try #require(_service2)
85+
service2.doSomething()
86+
service2.doSomething()
87+
#expect((service2 as? MockServiceImpl)?.count == 2)
88+
89+
let service3 = try #require(_service3)
90+
service3.doSomething()
91+
service3.doSomething()
92+
#expect((service3 as? MockServiceImpl)?.count == 2)
93+
}
94+
95+
@Test
96+
func factoryBehavior() throws {
97+
@WeakInject(MockServiceFactoryKey.self) var factory
98+
let _service1 = factory?.makeWeakService()
99+
let _service2 = factory?.makeWeakService()
100+
101+
let service1 = try #require(_service1)
102+
service1.doSomething()
103+
service1.doSomething()
104+
#expect((service1 as? WeakMockServiceImpl)?.count == 2)
105+
106+
let service2 = try #require(_service2)
107+
service2.doSomething()
108+
service2.doSomething()
109+
#expect((service2 as? WeakMockServiceImpl)?.count == 2)
110+
}
111+
}

Tests/DIContainerTests/Tests/WeakInjectTests.swift

Lines changed: 0 additions & 89 deletions
This file was deleted.

0 commit comments

Comments
 (0)