2013-07-28 135 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