2011-01-03 6 views
2

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

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

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

Менеджер отвечает за хранение в настоящее время прошедших проверку подлинности пользователей.

Модуль Ответственность за проверку каждого запроса в соответствии с политиками безопасности несет модуль. Модуль должен попросить менеджера определить, проверяется ли пользователь в настоящее время.

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

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

namespace Demo 
{ 
    public interface IRepository 
    { 
     object GetUser(int id); 
    }

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

}

+1

Это немного расплывчато, вы можете разместить некоторую реализацию псевдокод, чтобы продемонстрировать, что вы пытаетесь сделать? –

ответ

2

В классическом 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

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

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

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

var manager = HttpContext.Current.Application["Demo.Manager"] as Manager; 
Смежные вопросы