2013-07-28 137 views
4

我建立一个庞大的服务,并使用Ninjcet:动态绑定Ninject

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; 
    } 

所有帮助表示赞赏。

+0

请描述正是你需要什么帮助。你是否遇到异常?代码是否编译并运行,但Ninject是否抱怨缺少绑定?等 –

+0

我的问题是,我希望能够,而不是必须手动把所有绑定例如结合()。为了();我想找到实现接口的所有类,并绑定那些他们实现接口,由于接口具有相同的名称类+ I.在上面我的演示,我有接口和从组件类,但我需要能够添加使用那些在绑定<>()。 – h3li0s

+1

你应该看看'Ninject.Extensions.Conventions'命名空间 - 让* *约定的延伸和你可以做什么,我觉得你想要做的:) –

回答

2

随着Ninject约定扩展,你可以做

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

结合所有ISomethingSomething

+0

感谢您的帮助。用这个:解决我的问题:kernel.Bind(X => X .FromAssembliesMatching( “*”) .SelectAllClasses() .BindDefaultInterface()); – h3li0s

+0

测试您的解决方案@retailcoder,它也可以正常工作。 – h3li0s