向视图模型注入单个依赖项



我想让LoginViewModelLoginViewModelService有一个单独的依赖。
LoginViewModelService本身不能实现。其方法将由LoginControllerAccountController实现。

我现在面临的挑战是,当我实例化具有LoginViewModelService单一依赖的LoginViewModel时,我无法注入Login ControllerAccount Controller作为其实现类,即使它们实现了LoginViewModelService的方法。

为了更好地理解,我附上了我的游乐场的代码。

我希望我能做的是,有一些方法来完成单一依赖结构,但如果这是不可能的,我希望你的建议,我应该如何处理这个问题。基本上,我的目标是Login View Model使用的服务不应该访问它不需要的方法,例如Login Controller类中的Logout()Account控制器类中的delete()

class AccountController {
func create() {print("Create")}
func get() {print("get")}
func update() {print("update")}
func delete() {print("delete")}
}
// protocol LoginController {   
// ...
// }
class LoginController {
func apple() {print("apple")}
func google() {print("google")}
func phone() {print("phone")}
func logout() {print("logout")}
}
protocol LoginViewModelService {
func apple()
func google()
func phone()
func get()
}
extension LoginViewModelService {
func apple(){}
func google(){}
func phone(){}
func get(){}
}
class ViewModel {
init(serivice: LoginViewModelService) {}
}

let accountController = AccountController()
let loginController = LoginController()
extension AccountController: LoginViewModelService {}
extension LoginController: LoginViewModelService {}

// -------------------------This is what I hope I can do-------------
let vm = ViewModel(serivice: accountController & loginController)
// -------------------------------------------------------------------

经过思考,我想出了这个解决方案。

protocol CurrentProfileProvider {
func getMyProfile()
}
protocol ProfileCreator {
func create()
}
protocol ProfileUpdater {
func update(onlyLocally: Bool)
}
protocol ProfileDeleter {
func delete()
}
protocol ConversationCreator {
func create()
}
protocol ListenersProvider {
func listenersList() -> [String]
}
protocol AccountController:CurrentProfileProvider,ProfileCreator,ProfileUpdater,ProfileDeleter {}
class AccountControllerImpl:AccountController {
func update(onlyLocally: Bool) {}
func create() {print("Create")}
func getMyProfile() {print("Get my profile")}
func delete() {print("delete")}
}
protocol LoginProvider {
func apple()
func google()
func phone()
}
protocol Logout {
func logout()
}
protocol AuthenticationController: LoginProvider, Logout {}
class AuthenticationControllerImpl:AuthenticationController {
func apple() {print("apple")}
func google() {print("google")}
func phone() {print("phone")}
func logout() {print("logout")}
}
class ViewModel {
let service: Service
init(service: Service) {
self.service = service
}
}
extension ViewModel {
class Service {
let ac: CurrentProfileProvider
let lc: LoginProvider

init(ac: CurrentProfileProvider, lc: LoginProvider) {
self.ac = ac
self.lc = lc
}
}
}
let ac = AccountControllerImpl()
let lc = AuthenticationControllerImpl()
let service = ViewModel.Service(ac:ac ,lc: lc)
let vm = ViewModel(service: service)

最新更新