2016-06-29 15 views
0

考慮下面的一組類:是否可以使用Castle Windsor安裝程序註冊給定類的所有依賴項和唯一依賴項?

public interface IService { } 
public interface IDep1 { } 
public interface IDep2 { } 
public interface IDep3 { } 

public class Dep1 : IDep1 { } 
public class Dep2 : IDep2 { } 
public class Dep3 : IDep3 { } // this one is not used 

public class Service1 : IService 
{ 
    public Service1(IDep1 dep1) { } 
} 
public class Service2 : IService 
{ 
    public Service2(IDep1 dep1, IDep2 dep2) { } 
} 

我使用下面的溫莎城堡的安裝程序要註冊的繼承所有類都從IService

container.Register(Classes.FromThisAssembly() 
    .BasedOn(typeof(IService)) 
    .WithServiceSelf() 
    .WithServiceBase() 
    .LifestyleTransient()); 

我如何寫一個安裝程序,其會註冊所有類,它們是已經註冊的類的依賴關係,但僅此而已。換句話說:我如何寫一個通用的安裝程序,這將註冊IDep1IDep2,但不IDep3(因爲IDep3沒有被任何IService

+2

爲什麼你會保持在IDep3代碼庫如果它沒有被使用? – Paolo

+1

爲什麼要註冊一個班級但不使用它? – stuartd

+0

由於Dep3在其他地方使用,我不希望它在容器中。 – Eiver

回答

1

你可以試試過濾?該類型與.Where

container.Register(Classes.FromThisAssembly() 
    .BasedOn(typeof(IService)) 
    .WithServiceSelf() 
    .WithServiceBase() 
    .Where(type => !(type is IDep3)) 
    .LifestyleTransient()); 

See documentation

感覺,我認爲這樣做「聞香」 - 也許有另一個接口IDep1IDep2將繼承而IDep3不會,並通過接口做了登記

+0

同意,但是我相信OP希望根據是否實際使用IService實際使用它來有條件地註冊類型。 –

+0

雅我也這麼認爲,但城堡並沒有真正那樣工作...所以決定只是給這個選項+我的顧慮 –

+0

我絕對不想手動排除IDep3。我寧願訪問一個構造函數,遍歷所有參數並註冊這些類型並遞歸地重複。我的問題是:我是否必須手動執行此操作,或者是否有一些棘手的方法來告訴Castle爲我執行此操作? – Eiver