动态绑定Ninject

本文关键字:Ninject 动态绑定 | 更新日期: 2023-09-27 18:25:11

我正在构建一个大型服务,并使用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

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

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

其将所有CCD_ 1与CCD_。