Я строю проект библиотеки, который будет реализован клиентами.
Прежде чем поделиться некоторым кодом, я попытаюсь поделиться своими потребностями:
Библиотека состоит из базовых сущностейи базовые классы логики, и должны обеспечивать базовую реализацию, которая должна быть расширена.Некоторые логические классы должны вводиться с другими классами (как вы увидите позже в коде).
Клиентская сторона должна иметь возможность интеграции с библиотекой, расширяя сущности и добавляя уникальные переменные, а такжедобавить дополнительную уникальную логику для клиента.
То, как я пытаюсь это сделать в библиотеке, - объявить классы логики как обобщенные.
В клиенте я создаю класс-оболочку для каждого соответствующего класса в библиотеке.Оболочка должна быть снабжена инъекцией с производными сущностями как универсальными, чтобы я мог как работать с производными сущностями, так и добавлять уникальную логику.
Код библиотеки:
class BaseUser {
var firstName = "firstName"
}
class BaseCredentials {
var token = "token"
}
class CredentialsManager<T: BaseCredentials> {
var credentials: BaseCredentials!
// Injection
init(credentials: T) {
self.credentials = credentials
}
func getCurrentCredentialsToken() -> String {
return self.credentials.token
}
}
class UserManager<T: BaseUser> {
var credentialsManager: CredentialsManager<BaseCredentials>
var users = [BaseUser]()
// Injection
init (credentialsManager: CredentialsManager<BaseCredentials>) {
self.credentialsManager = credentialsManager
}
func addUser(user: T) -> Bool {
// Some base logic
if (credentialsManager.credentials.token == "some token") {
self.users.append(user)
return true
}
return false
}
}
Код клиента:
class DerrivedUser: BaseUser {
var lastName = "lastName"
}
class DerrivedCredentials: BaseCredentials {
var credentialsType = 1
}
class ClientUserManagerWrapper {
let userManager: UserManager<DerrivedUser>
// Injection
init (userManager: UserManager<DerrivedUser>) {
self.userManager = userManager
}
func addNewUser() {
let user = DerrivedUser()
// Call to base logic
if (self.userManager.addUser(user: user)) {
// Perform unique client logic
user.lastName = "just added"
}
}
}
class DependencyInjection {
func provideUserManagerWrapper() -> ClientUserManagerWrapper {
let credentials = BaseCredentials()
let credentialsManager = CredentialsManager(credentials: credentials)
let userManager: UserManager<DerrivedUser> = UserManager(credentialsManager: credentialsManager)
return ClientUserManagerWrapper(userManager: userManager)
}
}
Я не уверен, что это правильный способ сделать то, что я на самом деле пытаюсь сделать
Может кто-нибудь пролить свет на этот вопрос?
Спасибо