Внедрение зависимостей модуля ASP.NET - PullRequest
2 голосов
/ 03 января 2011

Во время разработки новой универсальной инфраструктуры аутентификации для некоторых из наших продуктов я столкнулся с архитектурной проблемой, для которой не могу найти хорошего решения.

Я попытался упростить проблему, чтобы легко ее объяснить.

В библиотеке есть два класса:

Менеджер Отвечает за хранение аутентифицированных пользователей.

Модуль Модуль отвечает за проверку каждого запроса в соответствии с политиками безопасности. Модуль должен попросить менеджера определить, аутентифицирован ли пользователь в данный момент.

Теперь менеджеру предоставляется реализация интерфейса, позволяющая менеджеру загружать пользователей из репозитория. Конкретная реализация не содержится в этой библиотеке. Из-за этого я не могу напрямую создать экземпляр хранилища в библиотеке.

У меня нет способа изменить свойства или предоставить аргументы для конструктора модуля. Итак, мой вопрос заключается в следующем: как я могу дать модулю ссылку на экземпляр диспетчера?

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>

} * * тысяча двадцать-один

Ответы [ 3 ]

2 голосов
/ 03 января 2011

В классическом ASP.NET я предпочитаю реализовывать интерфейс на моем HttpApplication (Global), который объявляет необходимые зависимости.Здесь IHasManager (приложение было написано lolcats):

public class Module: IHttpModule {
    Manager manager;
    public void Init(HttpApplication context) {
        IHasManager application = context as IHasManager;
        if (application != null) {
            manager = application.Manager;
        }
    }
}
0 голосов
/ 08 января 2011

Взгляните на это.

думаю, что оно должно делать то, что вам нужно

http://ninject.org/

0 голосов
/ 04 января 2011

Один из самых простых (если некрасивых) способов - вставить ваш экземпляр Manager в словарь приложения после его создания:

HttpContext.Current.Application["Demo.Manager"] = new Manager(new Repository());

Теперь вы можете получить к нему доступ в вашем модуле с помощью:

var manager = HttpContext.Current.Application["Demo.Manager"] as Manager;
...