This repository has been archived by the owner on Oct 2, 2023. It is now read-only.
/
ModuleLocator.vb
59 lines (57 loc) · 2.6 KB
/
ModuleLocator.vb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports System.Threading.Tasks
Imports DevExpress.Mvvm
Imports MvpvmNavigation.Model
Namespace MvpvmNavigation.Services
Public Interface IModuleLocator
Function IsModuleLoaded(ByVal moduleType As ModuleType) As Boolean
Function GetModule(ByVal moduleType As ModuleType) As Object
Sub ReleaseModule(ByVal [module] As Object)
End Interface
'
Friend Class ModuleLocator
Implements IModuleLocator
Private serviceContainer As IServiceContainer
Private modulesCache As IDictionary(Of ModuleType, WeakReference)
Public Sub New(ByVal serviceContainer As DevExpress.Mvvm.IServiceContainer)
Me.serviceContainer = serviceContainer
Me.modulesCache = New Dictionary(Of ModuleType, WeakReference)()
End Sub
Public Function IsModuleLoaded(ByVal moduleType As ModuleType) As Boolean Implements IModuleLocator.IsModuleLoaded
Return modulesCache.ContainsKey(moduleType)
End Function
Public Function GetModule(ByVal moduleType As ModuleType) As Object Implements IModuleLocator.GetModule
If moduleType = MvpvmNavigation.Model.ModuleType.None Then
Return Nothing
End If
Dim moduleReference As WeakReference = Nothing
If (Not modulesCache.TryGetValue(moduleType, moduleReference)) OrElse moduleReference.Target Is Nothing Then
Dim resolver = serviceContainer.GetService(Of IModuleTypesResolver)()
Dim moduleTypeName As String = resolver.GetTypeName(moduleType)
Dim activator = serviceContainer.GetService(Of IModuleActivator)()
Dim [module] = activator.CreateModule(moduleTypeName)
If moduleReference Is Nothing Then
moduleReference = New WeakReference([module])
modulesCache.Add(moduleType, moduleReference)
Else
moduleReference.Target = [module]
End If
End If
Return moduleReference.Target
End Function
Public Sub ReleaseModule(ByVal [module] As Object) Implements IModuleLocator.ReleaseModule
Dim key As ModuleType = ModuleType.None
For Each item In modulesCache
If Not Object.Equals(item.Value.Target, [module]) Then
Continue For
End If
key = item.Key
Exit For
Next item
modulesCache.Remove(key)
End Sub
End Class
End Namespace