动态绑定Ninject

4
我正在开发一个大型服务,并使用Ninjcet:
Bind<IMyObject>().To<MyObject>();

因为我的逻辑层相当大,而且会不断增长,所以我希望在一个程序集中自动创建绑定,只要该类实现了接口。
public void LoadAssembly()
{
  string[] files = Directory.GetFiles(binFolder, "Logic.dll",     SearchOption.AllDirectories);
  foreach (var file in files)
  {
    var fileName = Path.GetFileName(file);
    if (fileName != null && fileName.Contains("Logic"))
    {
      DynamicallyBindManagers(Assembly.LoadFrom(file));
    }
  }
}

private void DynamicallyBindManagers(Assembly assembly)
{
  var classes = FindClassesWithInterfacesInAssembly(assembly);

  // Remove unwanted classes
  for (var i = classes.Count - 1; i >= 0; i--)
  {
    if (classes[i].Name.Contains("`"))
    {
      classes.Remove(classes[i]);
    }
  }

  foreach (var cl in classes)
  {
    var interfaces = cl.GetInterfaces();

    foreach (var myInterface in interfaces)
    {
      if (classes.Any(c => c.Name == intf.Name.Remove(0, 1)))
      {
         var myClass = classes.First(c => c.Name == intf.Name.Remove(0, 1));           
         Bind<myInterface >().To<myClass>(); //How can I get Bind to accept myInterface & myClass
      }
    }
  }
}

private List<Type> FindClassesWithInterfacesInAssembly(Assembly assembly)
{
  var classes = new List<Type>();

  foreach (var ti in assembly.GetTypes().Where(x => x.IsClass))
  {
    if (ti.GetInterfaces().Any())
    {
      classes.Add(ti);
    }
   }
   return classes;
  }

非常感谢您的帮助。


请描述您需要帮助的具体内容。您是否遇到异常?代码是否编译并运行,但是Ninject报告缺少绑定等问题?等等。 - Mike Mertsock
我的问题是,我希望能够自动绑定所有实现了某个接口的类,而不是手动添加所有绑定,例如Bind<IMyObject>().To<MyObject>();。如果接口与类名相同且以I结尾,则将这些类绑定到它们实现的接口上。在上面的示例中,我有接口和程序集中的类,但我需要能够将它们添加到Bind<>().To<>();中。 - h3li0s
1
你应该查看Ninject.Extensions.Conventions命名空间 - 获取Conventions扩展,然后你就可以做我认为你想做的事情了 :) - Mathieu Guindon
1个回答

2

使用Ninject Conventions扩展,您可以执行以下操作

Bind (x => x.FromThisAssembly.SelectAllClasses.BindDefaultInterface));

这将所有ISomething绑定到Something


感谢您的帮助。我使用以下代码解决了我的问题:kernel.Bind(x => x .FromAssembliesMatching("*") .SelectAllClasses() .BindDefaultInterface()); - h3li0s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接