ASP.NET模块依赖注入

时间:2011-01-03 18:16:16

标签: c# asp.net architecture module dependencies

在为我们的某些产品设计新的通用身份验证框架期间,我遇到了一个架构问题,我似乎无法找到一个好的解决方案。

我试图简化问题,以便轻松解释。

该库有两个类:

经理负责存储当前经过身份验证的用户。

模块模块负责根据安全策略验证每个请求。模块必须要求经理确定用户当前是否已通过身份验证。

现在为管理器提供了一个接口实现,允许管理器从存储库加载用户。具体实现不包含在此库中。因此,我无法直接在库中实例化存储库的实例。

我无法修改属性或为模块构造函数提供参数。所以我的问题是,如何为模块提供对Manager实例的引用?

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

}

3 个答案:

答案 0 :(得分:2)

在经典ASP.NET中,我更喜欢在我的HttpApplicationGlobal)上实现一个声明必要依赖关系的接口。在这里,它是IHasManager(应用程序是由lolcats编写的):

public class Module: IHttpModule {
    Manager manager;
    public void Init(HttpApplication context) {
        IHasManager application = context as IHasManager;
        if (application != null) {
            manager = application.Manager;
        }
    }
}

答案 1 :(得分:0)

最简单(如果难看)的方法之一是在创建后将Manager实例填充到应用程序字典中:

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

现在您可以使用以下命令在模块中访问它:

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

答案 2 :(得分:-1)

看看这个。

认为它应该做你需要的事情

http://ninject.org/