我正在嘗試註冊所有實現與溫莎接口IProcess<T1, T2>
的類。要做到這一點我在安裝下面的代碼:爲什麼我不能在Windsor註冊多個接口的一個類?
// Register all implemented process interfaces
var procTypes = AppDomain.CurrentDomain
.GetAssemblies()
.SelectMany(x => x.GetTypes())
.Where(x => x.IsDerivedFromOpenGenericType(typeof(IProcess<,>)))
.ToList();
foreach (var procType in procTypes)
foreach (var procInterface in procType.GetInterfaces().Where(x => x.IsDerivedFromOpenGenericType(typeof(IProcess<,>))))
container.Register(Component.For(procInterface).ImplementedBy(procType).LifeStyle.Transient);
一類我一個嘗試註冊的是:
public class PositionProcesses
: IProcess<CreatePositionParams, PositionDisplayViewModel>,
IProcess<EditPositionParams, PositionDisplayViewModel>
{
}
第一接口被正確註冊,但在註冊第二個接口由這個類來實現,我收到以下錯誤:
Test method MyJobLeads.Tests.Controllers.PositionControllerTests.Windsor_Can_Resolve_PositionController_Dependencies threw exception:
Castle.MicroKernel.ComponentRegistrationException: There is a component already registered for the given key MyJobLeads.DomainModel.Processes.Positions.PositionProcesses
第一循環迭代我的變量是:
+ procInterface {Name = "IProcess`2" FullName = "MyJobLeads.DomainModel.Data.IProcess`2[[MyJobLeads.DomainModel.ProcessParams.Positions.CreatePositionParams, MyJobLeads.DomainModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[MyJobLeads.DomainModel.ViewModels.Positions.PositionDisplayViewModel, MyJobLeads.DomainModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]"} System.Type {System.RuntimeType}
+ procType {Name = "PositionProcesses" FullName = "MyJobLeads.DomainModel.Processes.Positions.PositionProcesses"} System.Type {System.RuntimeType}
在第二:
+ procInterface {Name = "IProcess`2" FullName = "MyJobLeads.DomainModel.Data.IProcess`2[[MyJobLeads.DomainModel.ProcessParams.Positions.EditPositionParams, MyJobLeads.DomainModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[MyJobLeads.DomainModel.ViewModels.Positions.PositionDisplayViewModel, MyJobLeads.DomainModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]"} System.Type {System.RuntimeType}
+ procType {Name = "PositionProcesses" FullName = "MyJobLeads.DomainModel.Processes.Positions.PositionProcesses"} System.Type {System.RuntimeType}
(這兩個都來自VS調試器。
任何想法?
啊我沒有注意到覆蓋。工作就像一個魅力,謝謝:) – KallDrexx
我不得不重讀這個幾次,以瞭解從OP的代碼的差異。您一次將接口數組全部傳遞給'For',而不是一次傳遞一個接口。我會留下我的回答,但我更喜歡這個,因爲溫莎處理你的命名:) –
添加基於約定的註冊示例 – hazzik