在为我们的某些产品设计新的通用身份验证框架期间,我遇到了一个架构问题,我似乎无法找到一个好的解决方案。
我试图简化问题,以便轻松解释。
该库有两个类:
经理负责存储当前经过身份验证的用户。
模块模块负责根据安全策略验证每个请求。模块必须要求经理确定用户当前是否已通过身份验证。
现在为管理器提供了一个接口实现,允许管理器从存储库加载用户。具体实现不包含在此库中。因此,我无法直接在库中实例化存储库的实例。
我无法修改属性或为模块构造函数提供参数。所以我的问题是,如何为模块提供对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.
}
}
答案 0 :(得分: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;
}
}
}
答案 1 :(得分:0)
最简单(如果难看)的方法之一是在创建后将Manager实例填充到应用程序字典中:
HttpContext.Current.Application["Demo.Manager"] = new Manager(new Repository());
现在您可以使用以下命令在模块中访问它:
var manager = HttpContext.Current.Application["Demo.Manager"] as Manager;
答案 2 :(得分:-1)