相关疑难解决方法(0)

With.Parameters.ConstructorArgument with ninject 2.0

如何在ninject 2.0中使用此功能?

MyType obj = kernel.Get<MyType>(With.Parameters.ConstructorArgument("foo","bar"));
Run Code Online (Sandbox Code Playgroud)

"With"不存在:(

c# ninject

35
推荐指数
1
解决办法
1万
查看次数

具有非依赖性参数的构造函数注入

我有这样的界面ITradingApi:

public interface ITradingApi
{
    IOrder CreateOrder(...);
    IEnumerable<Symbol> GetAllSymbols();
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这是交易软件供应商的不同API的外观.我的视图模型在其构造函数中依赖于此交易API:

public class MainViewModel
{
    public MainViewModel(ITradingApi tradingApi) { /* ... */ }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我使用Ninject作为IoC容器,因此我将创建一个我的视图模型的实例,如下所示:

var vm = kernel.Get<MainViewModel>();
Run Code Online (Sandbox Code Playgroud)

现在,我的问题:

执行ITradingApi可能需要额外的参数才能工作.
例:

  • 一个供应商API在内部使用TCP/IP,因此我需要一个主机名和一个端口.
  • 另一个供应商使用COM对象.在这里,我不需要任何信息.
  • 第三个供应商需要帐户的用户名和密码.

本着不允许不完整对象的精神,我将这些作为参数添加到具体实现的构造函数中.

现在,我不确定,这将如何运作.显然,这些附加参数不属于接口,因为它们特定于每个实现.
另一方面,这些附加参数需要由最终用户输入然后传递给实现ITradingApi,这意味着用户ITradingApi需要对具体实现有深入了解.
如何解决这个难题?

更新:
一种方法可能是创建一个ITradingApiProvider公开所需参数列表.View可以自动为这些参数创建一个输入表单,该表单将数据绑定到参数中ITradingApiProvider.现在,当ITradingApi从提供程序请求实例时,它可以使用这些参数来创建具体实现的实例.显然执行ITradingApiProviderITradingApi紧密耦合,但我认为只要每个实现ITradingApi都带有相应的实现,这不是问题ITradingApiProvider.

.net c# architecture dependency-injection

10
推荐指数
1
解决办法
1781
查看次数

使用非接口的构造函数参数的依赖注入

我仍然是DI的新手,我试图理解我是否以错误的方式思考问题.当我想表示一个依赖于IRandomProvider的Die对象时,我正在解决玩具问题.那个界面很简单:

public interface IRandomProvider 
{
   int GetRandom(int lower, int upper);
}
Run Code Online (Sandbox Code Playgroud)

我想要一个看起来像这样的Die构造函数:

Die(int numSides, IRandomProvider provider)
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用具有如下方法的静态DIFactory:

    public static T Resolve<T>()
    {
        if (kernel == null)
        {
            CreateKernel();
        }
        return kernel.Get<T>();
    }
Run Code Online (Sandbox Code Playgroud)

CreateKernel只是绑定到IRandomProvider的特定实现.

我希望能够用以下方式调用:

DIFactory.Resolve<Die>(20);
Run Code Online (Sandbox Code Playgroud)

如果没有制作特殊版本的"Resolve",我就无法完成这项工作,这可以让我处理ConstructorArgs.这似乎使事情变得过于复杂,并且需要我为其中的每个其他实例修改DIFactory,以及绑定到构造函数参数的特定名称.

如果我重构Die类不使用int构造函数,一切正常.但现在有人必须记住初始化numSides参数,这似乎是一个坏主意,因为它是类的要求.

我怀疑这对DI来说是一个糟糕的心理模型.任何人都可以开导我吗?

c# dependency-injection ninject

9
推荐指数
2
解决办法
1万
查看次数

标签 统计

c# ×3

dependency-injection ×2

ninject ×2

.net ×1

architecture ×1