设置ninject比较规则I +“Somevalue”= Somevalue

时间:2013-02-18 08:11:47

标签: c# .net ninject

您好我的问题可能有点愚蠢,但如果有人帮我,我将非常感激。

所以我的问题是:如何使用ninject将自动类设置为与规则I+"Class" = "Class"的接口比较?

让我们假设我们在一个项目中有很多类类,它是接口。

Class class1 : Iclass1{..}
Class class2 : Iclass2{..}
Class class3 : Iclass3{..}

和马马虎虎......有一百个班级和它的接口。

为每个类绑定规则编写是非常烦人的,我知道应该有一种自动方式来绑定它,就像在Castle Windsor中一样。

Thx,很多。我是Ninject的新人。

如果有人提供示例,请特别注意。

2 个答案:

答案 0 :(得分:2)

您无需使用规则进行映射:

I+“Somevalue” = Somevalue

相反,您可以使用反射来查找每个类的接口,下面的代码假设所有类型都在执行程序集中,而您的类名称以“Class”开头,方法非常类似:

var types = Assembly.GetExecutingAssembly().GetTypes()
                     .Where(t => t.Name.StartsWith("Class"));

foreach (var type in types)
{
    var interfaceType = type.GetInterfaces()
                            .Single();

    kernel.Bind(type).To(interfaceType);
}

但很容易,您可以根据惯例更改过滤类型的方式。

答案 1 :(得分:2)

你可以使用Ninject.Extensions.Conventions - 它有一个默认的绑定器,可以将所有IFoo绑定到Foo,当然你可以定义更强大的约定。

简单示例:

using Ninject;
using Ninject.Extensions.Conventions;

namespace NinjectConventionsDemo
{
    public interface ITool { }
    public class Tool : ITool { }

    internal class Program
    {
        private static void Main()
        {
            IKernel kernel = new StandardKernel();
            kernel.Bind(convention => convention
                                          .FromThisAssembly()
                                          .SelectAllClasses()
                                          .BindAllInterfaces()
                );
            var tool = kernel.Get<ITool>();
        }
    }
}