【问题标题】:Is it possible to pass a value from session into UnitOfWork constructor using dependency injection?是否可以使用依赖注入将会话中的值传递给 UnitOfWork 构造函数?
【发布时间】:2023-11-30 07:02:02
【问题描述】:

我目前正在努力支持 mvc4 项目中的多租户。现在,我知道我必须在 UnitOfWork 构造函数中执行以下查询:

"USE FEDERATION <FederationName>(FederationKey=<FederationID>) WITH RESET, FILTERING=ON"

现在从会话中检索值 (FederationName) 和 (FederationID),所以我必须将它们作为参数传递给 UnitOfWork 构造函数,但我想知道,这可能使用依赖注入吗?如果是,如何?我使用 ninject 作为依赖注入器。 这是当前在 NinjectWebCommon.cs 中完成绑定的方式:

private static void RegisterServices(IKernel kernel)
{
    ...
    kernel.Bind<IUnitOfWork>().To<UnitOfWork>();
    ...
}

这就是 UnitOfWork 构造函数的样子:

public UnitOfWork(DbContext dbContext, string federationName, int federationID)
{
    Database = dbContext;
    ((IObjectContextAdapter)dbContext).ObjectContext.Connection.Open();
    Database.Database.ExecuteSqlCommand(
        string.Format(@"USE FEDERATION {0}({1}={2}) WITH RESET, FILTERING={3}", 
        federationName,
        "FID",
        federationID,
        "ON"));
}

【问题讨论】:

标签: asp.net-mvc-4 dependency-injection ninject parameter-passing unit-of-work


【解决方案1】:

绑定IUnitOfWork接口时可以使用WithConstructorArgument方法。这样,您可以将参数绑定到将在解析 IUnitOfWork 时执行的 lambda,从会话中检索 federationName\federationID。查看this question 了解如何使用该方法。

因此,在您的情况下,您可以将 IUnitOfWork 注册为:

kernel.Bind<IUnitOfWork>()
.To<UnitOfWork>()
.WithConstructorArgument("federationName", 
                          ctx => HttpContext.Current.Session["federationName"])
.WithConstructorArgument("federationID", 
                          ctx => HttpContext.Current.Session["federationID"]);

您可能需要考虑在会话中找不到这些值时会发生什么。要考虑的另一件事可能是将会话包装在您自己的上下文对象中(如果您打算在稍后阶段从应用程序中的会话移开,这很有趣)。但是,这应该可以帮助您入门。

希望对你有帮助!

【讨论】:

    最近更新 更多