gpt4 book ai didi

asp.net - 如何在 ASP.NET 和 Windows 服务中使用相同的 DI 代码

转载 作者:行者123 更新时间:2023-12-02 17:45:46 25 4
gpt4 key购买 nike

我有一个关于如何在 ASP.NET mvc 应用程序和 Windows 服务中使用相同的 DI 代码的问题,因为两者都使用 NHibernate 与同一数据库进行交互。然而,Windows 服务执行后台任务。

像每个人一样,我有一个新的 Controller 工厂,它知道如何使用 StructureMap 实例化 Controller 。因此,我可以将所需的存储库作为其构造函数的参数提供给我的 Controller 。由于 Structuremap 使用 HTTPContextScope 控制 ISession 生命周期,因此我可以确保所有存储库针对每个 Web 请求都会收到相同的 ISession 实例。

但是,在 Windows 服务中并使用 Structuremap(相同的 DI 代码),我不知道有什么好方法可以在逻辑上隔离不同的后台任务以拥有唯一的 ISession 实例并与它们使用的存储库共享它。我希望同时执行多个任务,因此 ISession 不能是单例对象(正如使用 NHibernate 的桌面应用程序所建议的那样)。

我想在我的 Windows 服务中保留并引入“每个请求一个 session ”模式,信任 Structuremap 为每个任务提供相同的 ISession 实例。谁能指出我正确的方向?

谢谢

<小时/>

编辑

这两部分的帖子由 Corey Coogan 发布我认为这个问题应该得到解决。不过,我对 WCF 并不熟悉,并且容易对文章中的部分内容感到困惑。

http://blog.coreycoogan.com/2010/05/26/structuremap-wcf-nhibernate-part-1/ http://blog.coreycoogan.com/2010/05/27/structuremap-wcf-nhibernate-part-2/

最佳答案

在我的 Windows 服务中,我有一个与 ASP.NET MVC 中的 Bootstrap 完全相同的 Bootstrap :

public static class Bootstrapper
{
public static void Initialize()
{
StructureMap.ObjectFactory.Initialize(cfg =>
{
cfg.UseDefaultStructureMapConfigFile = false;
cfg.IgnoreStructureMapConfig = true;
cfg.AddRegistry<Web.Core.DI.NhibernateRegistry>();
cfg.AddRegistry<Web.Core.DI.DomainRegistry>();
cfg.AddRegistry<Web.Core.DI.ServicesRegistry>();
cfg.AddRegistry<Web.Core.DI.QuartzRegistry>();
});
ServiceLocator.SetLocatorProvider(() => new StructureMapServiceLocator(ObjectFactory.Container));
}
}

然后我为每个模块定义了一个注册表:

public class NhibernateRegistry: Registry
{
public NhibernateRegistry()
{
SchemaOperation schemaOperation = SchemaOperation.None;

For<ISessionFactory>()
.Singleton()
.Use(new BpReminders.Data.NH.NHibernateSessionFactory(connectionString, schemaOperation).SessionFactory);

For<IUnitOfWork>()
.HybridHttpOrThreadLocalScoped()
.Use<BpReminders.Data.NH.UnitOfWork>();

For<ISession>()
.HybridHttpOrThreadLocalScoped()
.Use(o => ((BpReminders.Data.NH.UnitOfWork)o.GetInstance<IUnitOfWork>()).CurrentSession);
}
}

服务启动后我就引导一切:

protected override void OnStart(string[] args)
{
Bootstrapper.Initialize();
}

最后我采用了单例模式,因为我的 Windows 服务不使用任何额外的线程。我知道 StructureMap 有一个关键字 AlwaysUnique ,它可能对您想要做的事情有用:

For<ISession>()
.AlwaysUnique()

代码注释说(关于AlwaysUnique)

///强制 StructureMap 始终使用唯一的实例
///停止“BuildSession”缓存

你必须深入研究这个问题,因为我刚刚做了一些测试。不多。

关于asp.net - 如何在 ASP.NET 和 Windows 服务中使用相同的 DI 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6419376/

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