2014-03-05 88 views
2

是否有可能在F#中使用Ninject进行隐式构造函数注入?如果是这样,怎么样?F#Ninject构造函数注入

我试着将[<Inject>]属性放在类型定义上,但是我收到了一个错误,认为它是无效的。

这里是我的尝试:

[<Inject>] 
type Blah(x : ISword) = 
+2

这应该是可能的 - 你可以编辑你的问题并发布代码,所以我们可以看到你有什么。这将帮助人们根据您的需求定制答案。 –

回答

2

Inject属性是仅限Property setter injection。构造函数注入是隐含的。只需创建绑定,然后使用构造函数注入创建kernel.Get<Blah>()Blah

+1

+1这是正确的。顺便说一句(我只是从示例中的ctor中删除了'[Inject]',在案例**中注意到[Inject]属性很重要这意味着你的大部分代码不需要知道Ninject,也不需要引用Ninject命名空间/库。**有点太TL;人们的DR –

1

这里的构造函数注入在F#:

type Foo(bar : IBar) = 
    // class members etc. here 

,需要你拍的类型的属性,以便了解任何图书馆,是做有问题;选另一个图书馆。

+0

+1查看其他评论;虽然Ninject确实允许通过Methods上的属性来覆盖默认选择策略,但绝对不建议或惯用。注意Ninject _ *不需要this_和[文档](https://github.com/ninject/ninject/wiki/Injection-Patterns)不推荐它 - 事实上,它们走出去的状态你的实际代码应该是不要指向容器[并且是容器不可知的]。 (如果你认为它在任何方式上有误导性,那么在这里进行任何修改都很高兴) –

2

该规范允许这样如下:

class-type-defn := 

    type-name primary-constr-args_opt object-val_opt '=' class class-type-body end 

其中

primary-constr-args := 

    attributes_opt accessopt (simple-pat, ... , simple-pat) 

其结果是,你只需要更改您的代码

type Blah [<Inject>](x : ISword) = 
+1

+1但是如果你使用Ninject,你绝对不应该这样做。 Ninject通过'Bind'表达式有很多方法来识别使用的正确构造函数(在不太可能的情况下,它不会仅仅使用默认的构造函数选择策略来做正确的事情)。 –