3
A
回答
6
是的,這是可能的。默認組件激活器僅用於公共構造函數。 您可以提供該組件,將採取內部構造考慮,或使用例如工廠,以激活組件定製組件激活:
var container = new WindsorContainer()
.AddFacility<FactorySupportFacility>()
.Register(Component.For<Foo>()
.UsingFactoryMethod(() => new Foo()));
var foo = container.Resolve<Foo>();
但是你真的應該重新考慮使.ctor放在首位內部。這樣做確實不是一個好主意,特別是當你將課程作爲外部世界的組件暴露出來時。
0
按照接受的答案的建議下,我才得以延長DefaultComponentActivator
類protected
建設者的工作(它仍然無法與private
或internal
工作;下面的代碼工作正常,那就是,但在別的東西DynamicProxy創建鏈失敗)。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Castle.Core;
using Castle.MicroKernel;
using Castle.MicroKernel.ComponentActivator;
using Castle.MicroKernel.Context;
namespace /* YourNameSpaceHere */
{
[Serializable]
public class NonPublicComponentActivator : DefaultComponentActivator
{
public NonPublicComponentActivator(ComponentModel model, IKernelInternal kernel, ComponentInstanceDelegate onCreation, ComponentInstanceDelegate onDestruction)
: base(model, kernel, onCreation, onDestruction)
{ /* do nothing */ }
private readonly List<Type> loadedTypes = new List<Type>();
protected override ConstructorCandidate SelectEligibleConstructor(CreationContext context)
{
lock (loadedTypes)
{
if (!loadedTypes.Contains(context.RequestedType))
{
loadedTypes.Add(context.RequestedType);
// Add the missing non-public constructors too:
var ctors = context.RequestedType.GetConstructors
(
BindingFlags.NonPublic | BindingFlags.Instance
);
foreach (var ctor in ctors)
{
Model.AddConstructor
(
new ConstructorCandidate
(
ctor,
ctor.GetParameters().Select(pi => new ConstructorDependencyModel(pi)).ToArray()
)
);
}
}
}
return base.SelectEligibleConstructor(context);
}
}
}
然後,您的容器上,你通過通用Activator
方法針對ComponentRegistration
對象登記本,所以我container.Register調用看起來是這樣的:
_container.Register
(
// . . .
AllClasses.FromThisAssembly().BasedOn<ISomeInterface>()
.Configure
(
c => c.LifeStyle.Transient
.Interceptors<MyInterceptor>()
.Activator<NonPublicComponentActivator>() // <--- REGISTERED HERE
),
// . . .
);
希望幫助別人!
相關問題
- 1. 溫莎城堡註冊實施通過構造函數
- 2. 溫莎城堡內部構造函數/類
- 3. 溫莎城堡&註冊ApplicationContext
- 4. 城堡溫莎構造器注入
- 5. 註冊AutoMapper 5.1.1與溫莎城堡
- 6. 與溫莎城堡
- 7. 溫莎城堡 - 無法註冊argumants
- 8. 城堡溫莎自動註冊
- 9. 溫莎城堡註冊裝飾師
- 10. 城堡溫莎註冊開仿製藥
- 11. 城堡溫莎多個服務註冊
- 12. 城堡溫莎註冊 - AddAdditionalInterfaces()實施UsingFactoryMethod()
- 13. 城堡溫莎複雜通用註冊
- 14. 溫莎城堡:多構造問題
- 15. 與構造溫莎城堡寄存器類參數
- 16. 溫莎城堡:如何註冊內部實現
- 17. 城堡溫莎 - 不刺默認構造函數參數
- 18. 使用與溫莎城堡
- 19. 溫莎城堡與UsingFactoryMethod LifestyleTransient
- 20. 與溫莎城堡在C#
- 21. Umbraco MVC與城堡溫莎
- 22. 在溫莎城堡
- 23. 城堡溫莎Castle.MicroKernel.ComponentRegistrationException
- 24. ComponentNotFoundException城堡溫莎
- 25. 在溫莎城堡
- 26. 與構造溫莎城堡自動登記參數
- 27. 溫莎城堡:按照公約註冊並命名部分
- 28. 城堡溫莎註冊的開放式通用裝飾類型
- 29. 在城堡註冊泛型類型溫莎
- 30. 如何獲得與溫莎城堡的自動註冊
嗨Krzystzof,我認爲「如果它是如何完成的?」這個問題是隱含的!我猜不是。所以: 你怎麼做到的? 乾杯 Joni – joniba 2010-03-03 13:20:15
謝謝伊恩。所以實際上我必須創建一個工廠來使用反射來構建這些組件。因爲Castle Windsor已經在使用反射來進行組件註冊,所以感到羞恥。但我理解這個推理。 再次感謝。 – joniba 2010-03-03 14:11:51
+1表示重新考慮設計 – 2010-03-03 15:18:45