Обеспечить внедрение зависимостей как в код библиотеки, так и в код клиента, с помощью обобщений - это правильный путь? - PullRequest
0 голосов
/ 12 мая 2019

Я строю проект библиотеки, который будет реализован клиентами.

Прежде чем поделиться некоторым кодом, я попытаюсь поделиться своими потребностями:

Библиотека состоит из базовых сущностейи базовые классы логики, и должны обеспечивать базовую реализацию, которая должна быть расширена.Некоторые логические классы должны вводиться с другими классами (как вы увидите позже в коде).

Клиентская сторона должна иметь возможность интеграции с библиотекой, расширяя сущности и добавляя уникальные переменные, а такжедобавить дополнительную уникальную логику для клиента.

То, как я пытаюсь это сделать в библиотеке, - объявить классы логики как обобщенные.

В клиенте я создаю класс-оболочку для каждого соответствующего класса в библиотеке.Оболочка должна быть снабжена инъекцией с производными сущностями как универсальными, чтобы я мог как работать с производными сущностями, так и добавлять уникальную логику.

Код библиотеки:

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)
    }
 }

Я не уверен, что это правильный способ сделать то, что я на самом деле пытаюсь сделать

Может кто-нибудь пролить свет на этот вопрос?

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...