Во время разработки новой универсальной инфраструктуры аутентификации для некоторых из наших продуктов я столкнулся с архитектурной проблемой, для которой не могу найти хорошего решения.
Я попытался упростить проблему, чтобы легко ее объяснить.
В библиотеке есть два класса:
Менеджер Отвечает за хранение аутентифицированных пользователей.
Модуль Модуль отвечает за проверку каждого запроса в соответствии с политиками безопасности. Модуль должен попросить менеджера определить, аутентифицирован ли пользователь в данный момент.
Теперь менеджеру предоставляется реализация интерфейса, позволяющая менеджеру загружать пользователей из репозитория. Конкретная реализация не содержится в этой библиотеке. Из-за этого я не могу напрямую создать экземпляр хранилища в библиотеке.
У меня нет способа изменить свойства или предоставить аргументы для конструктора модуля. Итак, мой вопрос заключается в следующем: как я могу дать модулю ссылку на экземпляр диспетчера?
namespace Demo
{
public interface IRepository
{
object GetUser(int id);
}</p>
<code>public class Manager
{
public IRepository Repository { get; private set; }
public Manager(IRepository repository)
{
this.Repository = repository;
}
}
public class Module : IHttpModule
{
// How can i access an instance of the manager class here
// when I am unable to instantiate an instance of
// of an implementation of the IRepository interface.
}
</code>
} * * тысяча двадцать-один