【发布时间】:2011-04-08 20:26:12
【问题描述】:
在我的 MVC3 应用程序中,我有一个 IDataRepository 接口,我的所有控制器都引用该接口,以使它们能够访问数据层。还有一个 DataRepository 类,它为特定的数据源(在我的例子中是一个 nHydrate 派生的实体框架)实现 IDataRepository。 DataRepository 类采用单个参数,即底层数据库的连接字符串。
我已经使用以下绑定成功地将 nInject 用于 IoC 和控制器类:
kernel.Bind<IDataRepository>()
.To<DataRepository>()
.WithConstructorArgument("connectionString", DataRepositoryBase.GetConnectionString());
今天我阅读了有关 nInject 作用域的信息,我认为安排一些事情以便为每个请求只创建一个 DatabaseRepository 实例会很有用(我认为这会更有效,尽管使用 EF 我不是当然)。
不幸的是,我似乎无法弄清楚如何正确实现该模式。例如,这不起作用:
kernel.Bind<DataRepository>()
.ToSelf()
.InRequestScope()
.WithConstructorArgument("connectionString", DataRepositoryBase.GetConnectionString());
kernel.Bind<IDataRepository>()
.To<DataRepository>();
我的想法是,这将只创建一个 DataRepository 实例,该实例将用于对 IDataRepository 的所有引用。错误消息抱怨找不到 connectionString 参数的匹配项,并且 DataRepository 不是自绑定的。我尝试了一些变体,但是当我可以让它工作时,并没有遵循单例模式(即,我可以在调试器中看到正在创建多个 DataRepository 实例)。
我在这里遗漏了一些明显的东西:)。
--- 附录 --- 不幸的是,该建议并未阻止在同一个请求中创建多个实例。
明确地说,我尝试的是:
public class BaseControllerModule : NinjectModule
{
public override void Load()
{
Bind<IDataRepository>().To<DataRepository>().InRequestScope()
.WithConstructorArgument("connectionString", DataRepositoryBase.GetConnectionString());
}
}
而我监控的是构造函数:
public DataRepository( string connectionString )
: base(connectionString)
{
}
-- 更多信息 #2--
这是 Ninject 正在为我解决的类的布局:
public class DataRepositoryBase
{
protected DataRepositoryBase( string connectionString )
{}
public static string GetConnectionString() {}
}
public class DataRepository : DataRepositoryBase, IDataRepository
{
public DataRepository( string connectionString )
: base(connectionString)
{}
}
我省略了实现细节,但希望这能描绘出更好的画面。
仔细查看,我想知道我是否通过将 connectionString 设置为 DataRepository 及其基类 DataRepositoryBase 的构造函数参数而导致问题。 Ninject 不会在调用基类构造函数时解析 connectionString 吗?
附言我很晚才意识到我不需要 DataRepositoryBase,因为它的功能可以合并到 DataRepository 中。我已经这样做了,但我仍然在似乎是一个请求中多次调用 DataRepository 的构造函数。
p2.s.为了好玩,我尝试在 Ninject 绑定定义中声明 InSingletonScope()。这很有效——DataRepository 的构造函数现在只在首次访问应用程序时被调用一次。但我认为在 MVC 应用程序中使用单例并不是一个好主意。这似乎会导致应用程序的“状态”在内存中“锁定”。
--- 更多信息 ---
问题似乎与我设计 MVC 应用程序的方式有关。我假设从浏览器返回服务器的单个请求通常会导致按顺序处理多个请求(我正在观察 MvcApplication 类中触发的 BeginRequest 事件)。似乎每次我转换到不同的控制器时都会生成一个新请求(例如,通过 RedirectToAction)。我想这是有道理的,但这意味着 Ninject 的 InRequestScope 不会完全按照我的意愿行事。
但这也让我怀疑我是否只是设计了错误的应用程序。似乎我应该将浏览器调用时可能调用的所有操作方法分组到一个控制器中。相反,我根据它们如何适合我的应用程序的概念模型来组织操作方法。
【问题讨论】:
标签: asp.net-mvc ninject repository-pattern