gpt4 book ai didi

c# - Ninject 基于参数类型的条件绑定(bind)

转载 作者:太空狗 更新时间:2023-10-29 18:35:50 36 4
gpt4 key购买 nike

我正在使用工厂返回数据发送器:

Bind<IDataSenderFactory>()
.ToFactory();

public interface IDataSenderFactory
{
IDataSender CreateDataSender(Connection connection);
}

我有两种不同的数据发送器实现(WCF 和远程处理),它们采用不同的类型:

public abstract class Connection
{
public string ServerName { get; set; }
}

public class WcfConnection : Connection
{
// specificProperties etc.
}

public class RemotingConnection : Connection
{
// specificProperties etc.
}

我正在尝试使用 Ninject 根据从参数传递的连接类型绑定(bind)这些特定类型的数据发送器。我尝试了以下失败:

Bind<IDataSender>()
.To<RemotingDataSender>()
.When(a => a.Parameters.Single(b => b.Name == "connection") as RemotingConnection != null)

我相信这是因为“.When”仅提供请求,我需要完整的上下文才能检索实际参数值并检查其类型。我不知道该怎么做,除了使用命名绑定(bind),实际实现工厂并将逻辑放在那里,即

public IDataSender CreateDataSender(Connection connection)
{
if (connection.GetType() == typeof(WcfConnection))
{
return resolutionRoot.Get<IDataSender>("wcfdatasender", new ConstructorArgument("connection", connection));
}

return resolutionRoot.Get<IDataSender>("remotingdatasender", new ConstructorArgument("connection", connection));
}

最佳答案

在查看 Ninject 源代码后,我发现了以下内容:

  • a.Parameters.Single(b => b.Name == "connection") 为您提供 IParameter 类型的变量,而不是实际参数。

  • IParameter 有方法 object GetValue(IContext context, ITarget target) 不需要 null context 参数(target 可以是 null)。

  • 我还没有找到任何方法从 Request 获取 IContext(您的示例中的变量 a)。

  • Context 类没有无参数构造函数,因此我们无法创建新的 Context。

要使其正常工作,您可以创建虚拟 IContext 实现,例如:

public class DummyContext : IContext
{
public IKernel Kernel { get; private set; }
public IRequest Request { get; private set; }
public IBinding Binding { get; private set; }
public IPlan Plan { get; set; }
public ICollection<IParameter> Parameters { get; private set; }
public Type[] GenericArguments { get; private set; }
public bool HasInferredGenericArguments { get; private set; }
public IProvider GetProvider() { return null; }
public object GetScope() { return null; }
public object Resolve() { return null; }
}

然后使用它

kernel.Bind<IDataSender>()
.To<RemotingDataSender>()
.When( a => a.Parameters
.Single( b => b.Name == "connection" )
.GetValue( new DummyContext(), a.Target )
as RemotingConnection != null );

如果有人可以发布一些有关从 When() 内部获取 Context 的信息,那就太好了...

关于c# - Ninject 基于参数类型的条件绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15267368/

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