gpt4 book ai didi

nhibernate - Quartz.NET, NH ISession & Ninject Scope

转载 作者:行者123 更新时间:2023-12-04 21:22:34 25 4
gpt4 key购买 nike

我正在尝试实现一项将基于 Quartz.Net 运行作业的服务。这些作业可能具有 IRepository<> 之类的依赖项,并且存储库实现将注入(inject)一个 NHibernate ISession。 (Quartz 将托管在 Windows 服务中)。作业是通过使用 Ninject 解决的 IJob 工厂实现来解决的(当前包装在 IServiceLocator 实现中)。

工作范围

我希望能够使用 Ninject 来确定每个作业的 ISession 范围,以便每个作业创建一个 session ,可以在多个 IRepository<> 中使用。

不确定这是否可能,但我想知道是否有人有这方面的经验?

我可以以某种方式使用 Job 上下文来创建 Kernel.InScope(???) 使用的 Scope。

Quartz.Net IJobFactory:

public class JobFactory : IJobFactory
{
readonly IServiceLocator locator;

public JobFactory(IServiceLocator locator)
{
this.locator = locator;
}

public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
{
try
{
var jobDetail = bundle.JobDetail;
var jobType = jobDetail.JobType;

return (IJob)locator.Resolve(jobType);
}
catch (Exception e)
{
var se = new SchedulerException("Problem instantiating class", e);
throw se;
}
}
}

Ninject 绑定(bind):
        //Service Locator
Bind<IServiceLocator>().To<NinjectAdapter>();

//Quartz Bindings
Bind<IJobFactory>().To<JobFactory>();

//NHibernate Bindings
Bind<ISessionFactory>().ToMethod(ctx => ctx.Kernel.Get<NHibernateConfiguration>().BuildSessionFactory()).InSingletonScope();
Bind<ISession>().ToMethod(ctx => ctx.Kernel.Get<ISessionFactory>().OpenSession());// ToDo: Figure out how to scope session

//Repository Bindings
Bind(typeof (IRepository<>)).To(typeof (ReadWriteRepository<>));

主执行:
        InitializeIoC();
scheduler = schedulerFactory.GetScheduler();
scheduler.JobFactory = ServiceLocator.Resolve<IJobFactory>();
InitializeJobs();
scheduler.Start();

工作示例:
public class TestJob3 : IJob
{
private readonly IRepository<Customer> repo;
private readonly IRepository<Order> orderRepo;

public TestJob3(IRepository<Customer> repo, IRepository<Order> orderRepo)
{
//orderRepo and repo should have the same ISession

this.repo = repo;
this.oderRepo = orderRepo;
System.Diagnostics.Debug.WriteLine("Job 3 Created");
}

#region Implementation of IJob

public void Execute(IJobExecutionContext context)
{
System.Diagnostics.Debug.WriteLine("Job 3 Executing");
using (var scope = new TransactionScope())
{
var customer = repo.GetById(1);
customer.Name = "Blue Goats";
repo.Save(customer);
scope.Complete();
}
}

#endregion
}

** 存储库片段:**
public class ReadWriteRepository<TEntity> : IRepository<TEntity> where TEntity : class, IRootEntity
{
private readonly ISession session;

public ReadWriteRepository(ISession session)
{
this.session = session;
}

public virtual TEntity GetById(int id)
{
var entity = session.Get<TEntity>(id);
return entity;
}

public virtual TEntity Save(TEntity entity)
{
session.SaveOrUpdate(entity);
return entity;
}
}

感谢您抽出宝贵的时间!

更新
我最终使用了 Remo 的建议并使用了 InCallScope():
Bind<ISession>().ToMethod(ctx => ctx.Kernel.Get<ISessionFactory>().OpenSession()).InCallScope();

我喜欢思考它的方式(正确与否?)是从“初始”获取的所有内容在整个依赖关系树中重用相同的项目

最佳答案

关于nhibernate - Quartz.NET, NH ISession & Ninject Scope,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9608327/

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