gpt4 book ai didi

c# - ServiceStack Funq.Container 中相同接口(interface)的多个实现

转载 作者:行者123 更新时间:2023-11-30 14:56:08 26 4
gpt4 key购买 nike

在 ServiceStack 应用程序中,我将 Funq 配置为在每个请求中注入(inject)一个 session ,如下所示:

container.Register<NHibernate.ISessionFactory>(sessionFactoryForDB1);
container.Register<NHibernate.ISession>(c => c.Resolve<NHibernate.ISessionFactory>()
.OpenSession())
.ReusedWithin(Funq.ReuseScope.Request);

我的服务看起来像这样,而且工作正常:

public class MyNhAwareService : Service
{
public ISession Session { get; set; }

public object Any(DoSomething request)
{
...
}
}

现在,当我想将第二个 NHibernate 数据库与它自己的 session 工厂混合使用时,问题就来了:

container.Register<NHibernate.ISessionFactory>(sessionFactoryForDB1);
container.Register<NHibernate.ISession>(c => c.Resolve<NHibernate.ISessionFactory>()
.OpenSession())
.ReusedWithin(Funq.ReuseScope.Request);
// add a different session factory
container.Register<NHibernate.ISessionFactory>(sessionFactoryForDB2);

我一直在尝试使用 Funq 的各种方式,当我发现“RegisterNamed()”方法时,我认为我已经找到了前进的方向,但这仍然无济于事,我可以'不要在我的服务中使用除 TryResolve() 之外的任何东西。

这看起来应该是可能的,但我正在用头撞墙试图解决这个问题...任何建议将不胜感激。

最佳答案

您有几种解决方法。

选项 1:独特的接口(interface)

此选项是为每个 NHibernate 数据库创建一个不同的接口(interface),以便 Funq 可以唯一地解析它们。

例如:

interface FactoryA : NHibernate.ISessionFactory
{
}

interface FactoryB : NHibernate.ISessionFactory
{
}

然后你就可以像现在这样继续了。这同样适用于 session 。有关该过程的更多详细信息,请参见此处:

How to register multiple IDbConnectionFactory instances using Funq in ServiceStack.net

选项 2:命名实例

这个选项我不太熟悉,但是你可以使用 Funq 命名你的实例:

container.Register<NHibernate.ISessionFactory>("FactoryA",sessionFactoryForDB1);

然后在您的服务中,这样解决它:

ServiceStackHost.Instance.Container.ResolveNamed<NHibernate.ISessionFactory>("FactoryA");

此选项使用服务位置,我个人认为它不太吸引人。

关于c# - ServiceStack Funq.Container 中相同接口(interface)的多个实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23707406/

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