gpt4 book ai didi

c# - 当关键类需要 session (或其他特定于上下文的变量)时如何设置 IoC

转载 作者:太空狗 更新时间:2023-10-29 17:41:08 24 4
gpt4 key购买 nike

我试图找出在依赖类可以根据应用程序中的某些变量(在本例中为 session 状态)发生变化的情况下如何使用 IoC。例如,我们的每个客户都有不同的数据库,因此与数据库的连接需要建立在存储在他们的 Session 中的值上(特别是因为一些用户如果拥有多个业务可能有多个数据库,并且会在数据库之间切换) .

这是我们当前如何设置此结构的通用示例:

public class MyTestController : ControllerBase
{
Repository _rep;

public MyTest(Repository rep)
{
_rep = rep;
}

public MyTest()
{
string connString = String.Format("Server={0}; Database={1};"
, SessionContainer.ServerName, SessionContainer.DatabaseName;
var dc = new DataContext(connString);
_rep = new Repository(dc);
}

public int SampleFn()
{
return _rep.GetCountOfEmployees();
}
}

public class Repository
{
DataContext _context;

public Repository(DataContext context)
{
_context = context;
}
}

我们能否使用 IoC 进行设置并消除默认的 c-tors?如果是这样,如何?我使用 D.I. 没有问题。像这样,但我想探索 StructureMap 或 Unity 的可能性(注意:我们通常将 db/server 传递给构建数据上下文的工厂类......上面的例子只是为了简洁)。

最佳答案

Repository 实例的创建方式及其生命周期与 Controller 无关。

当你在容器中注册组件时,你应该指定组件的生命周期。根据您的实现,您可以简单地选择将存储库的生命周期设置为跟随 session 。

在任何情况下,您都可以使用工厂从 session 创建存储库,但要在 Controller 外部执行此操作。

您绝对需要摆脱默认构造函数。


我想不起来如何在 Unity 或 StructureMap 中执行此操作,所以这里有一个 CaSTLe Windsor 示例。

定义一个抽象工厂:

public interface IRepositoryFactory
{
Repository Create();
}

和一个实现

public class MyRepositoryFactory : IRepositoryFactory
{
private readonly HttpContextBase httpContext;

public MyRepositoryFactory(HttpContextBase httpContext)
{
if (httpContext == null)
{
throw new ArgumentNullException("httpContext");
}

this.httpContext = httpContext;
}

#region IRepositoryFactory Members

public Repository Create()
{
// return Repository created from this.httpContext
}

#endregion
}

现在注册所有东西

container.AddFacility<FactorySupportFacility>();
container.Register(Component.For<IRepositoryFactory>()
.ImplementedBy<MyRepositoryFactory>()
.LifeStyle.PerWebRequest);
container.Register(Component.For<Repository>()
.UsingFactory((IRepositoryFactory f) => f.Create())
.LifeStyle.PerWebRequest);

这里我使用了 PerWebRequest 生活方式,但如果你想优化你可能想要创建一个自定义的 PerWebSession 生活方式。这在 CaSTLe 中并不难,但我不记得在其他 DI Container 中有多难。

您还需要注册 HttpContextBase,因为 MyRepositoryFactory 依赖于它。

关于c# - 当关键类需要 session (或其他特定于上下文的变量)时如何设置 IoC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1890341/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com