gpt4 book ai didi

c# - Windsor TypedFactoryFacility 坏了?

转载 作者:太空狗 更新时间:2023-10-29 22:32:34 26 4
gpt4 key购买 nike

我正在尝试根据 Windsor's example 创建类型工厂.这是我的工厂界面:

public interface ICustomJsonResultFactory
{
JsonResult Create();
}

在我的 global.asax 中,我通过首先添加以下两个工具来设置 Windsor 容器:

.AddFacility<FactorySupportFacility>()
.AddFacility<TypedFactoryFacility>();

完成后,我注册我的组件:

Component.For<JsonResult>()
.ImplementedBy<CustomJsonResult>()
.LifestyleTransient(),
Component.For<ICustomJsonResultFactory>()
.AsFactory())

我的一个 Controller 有一个 ICustomJsonResultFactory 属性。当我尝试解析 Controller 时,我在日志中得到以下信息:

Castle.Core.DependencyResolution: DEBUG 8 - 
Client: DefaultTypedFactoryComponentSelector / ITypedFactoryComponentSelector
Model: Dependency 'getMethodsResolveByName' type 'System.Boolean'
Dependency: True
Castle.Core.DependencyResolution: DEBUG 8 -
Client: DefaultTypedFactoryComponentSelector / ITypedFactoryComponentSelector
Model: Dependency 'fallbackToResolveByTypeIfNameNotFound' type 'System.Boolean'
Dependency: False
Castle.Core.DependencyResolution: DEBUG 8 -
Client: TypedFactoryInterceptor
Model: Dependency 'kernel' type 'Castle.MicroKernel.IKernelInternal'
Dependency: Castle.MicroKernel.DefaultKernel
Castle.Core.DependencyResolution: DEBUG 8 -
Client: TypedFactoryInterceptor
Model: Dependency 'componentSelector' type 'Castle.Facilities.TypedFactory.ITypedFactoryComponentSelector'
Dependency: Castle.Facilities.TypedFactory.DefaultTypedFactoryComponentSelector
A first chance exception of type 'System.ArgumentException' occurred in Castle.Windsor.dll
A first chance exception of type 'System.ArgumentException' occurred in Castle.Windsor.dll
A first chance exception of type 'Castle.MicroKernel.ComponentActivator.ComponentActivatorException' occurred in Castle.Windsor.dll

我认为这部分很重要,所以我指出:

Castle.Windsor Warning: 0 : Exception when resolving optional dependency Dependency 'JsonResultFactory' type 'CompanyName.Web.Mvc.ICustomJsonResultFactory' on component CompanyName.Web.OrderProcessing.Controllers.PickTicketController., Castle.MicroKernel.ComponentActivator.ComponentActivatorException: ComponentActivator: could not proxy CompanyName.Web.Mvc.ICustomJsonResultFactory ---> System.ArgumentException: Component CompanyName.Web.Mvc.ICustomJsonResultFactory is not a typed factory. TypedFactoryInterceptor only works with typed factories.

   at Castle.Facilities.TypedFactory.Internal.TypedFactoryInterceptor.SetInterceptedComponentModel(ComponentModel target)
at Castle.Windsor.Proxy.AbstractProxyFactory.SetOnBehalfAware(IOnBehalfAware onBehalfAware, ComponentModel target)
at Castle.Windsor.Proxy.AbstractProxyFactory.ObtainInterceptors(IKernel kernel, ComponentModel model, CreationContext context)
at Castle.Windsor.Proxy.DefaultProxyFactory.Create(IKernel kernel, Object target, ComponentModel model, CreationContext context, Object[] constructorArguments)
at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.CreateInstance(CreationContext context, ConstructorCandidate constructor, Object[] arguments)
--- End of inner exception stack trace ---
at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.CreateInstance(CreationContext context, ConstructorCandidate constructor, Object[] arguments)
at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.Instantiate(CreationContext context)
at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.InternalCreate(CreationContext context)
at Castle.MicroKernel.ComponentActivator.AbstractComponentActivator.Create(CreationContext context, Burden burden)
at Castle.MicroKernel.Lifestyle.AbstractLifestyleManager.CreateInstance(CreationContext context, Boolean trackedExternally)
at Castle.MicroKernel.Lifestyle.SingletonLifestyleManager.Resolve(CreationContext context, IReleasePolicy releasePolicy)
at Castle.MicroKernel.Handlers.DefaultHandler.ResolveCore(CreationContext context, Boolean requiresDecommission, Boolean instanceRequired, Burden& burden)
at Castle.MicroKernel.Handlers.ExtendedHandler.InvokeResolvePipeline(Int32 extensionIndex, ResolveInvocation invocation)
at Castle.MicroKernel.Handlers.ExtendedHandler.<>c__DisplayClass6.<InvokeResolvePipeline>b__5()
at Castle.MicroKernel.Handlers.ResolveInvocation.Proceed()
at Castle.MicroKernel.Handlers.ComponentLifecycleExtension.Intercept(ResolveInvocation invocation)
at Castle.MicroKernel.Handlers.ExtendedHandler.InvokeResolvePipeline(Int32 extensionIndex, ResolveInvocation invocation)
at Castle.MicroKernel.Handlers.ExtendedHandler.Resolve(CreationContext context, Boolean instanceRequired)
at Castle.MicroKernel.Handlers.AbstractHandler.Resolve(CreationContext context)
at Castle.MicroKernel.Resolvers.DefaultDependencyResolver.ResolveFromKernelByType(CreationContext context, ComponentModel model, DependencyModel dependency)
at Castle.MicroKernel.Resolvers.DefaultDependencyResolver.ResolveFromKernel(CreationContext context, ComponentModel model, DependencyModel dependency)
at Castle.MicroKernel.Resolvers.DefaultDependencyResolver.ResolveCore(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency)
at Castle.MicroKernel.Resolvers.DefaultDependencyResolver.Resolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency)
at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.ObtainPropertyValue(CreationContext context, PropertySet property, IDependencyResolver resolver)

我已尝试将 Release 方法添加到每个 Windsor 示例的 Controller 中。我还尝试让工厂的 Create 返回一个接口(interface)而不是 JsonResult。我尝试使用 ILSpy 浏览 Windsor 源代码,但无济于事。

我做错了什么?我想我非常严格地遵循了示例...问题是在我的代码中还是在 Windsor 中?

我在 .Net 4.5 中使用各种 CaSTLe 库的 3.2.0 版。

最佳答案

事实证明,我是在注册我的工厂组件后安装该设施的。我以为它在我所有的组件之前,但我错了。您必须先安装该设施。如果该设施尚未安装,我错误地期望 AsFactory() 中出现异常。

这是重现该问题的完整程序。

public interface IFooFactory {   IFoo Create();   }
public interface IFoo { void DoFoo(); }

public class Foo : IFoo
{
public void DoFoo()
{
Console.WriteLine("I pity the foo");
}
}

public class Bar
{
public IFooFactory MyFooFactory { get; set; }

public void DoBar()
{
var foo = MyFooFactory.Create();
foo.DoFoo();
}

static void Main(string[] args)
{
var container = new WindsorContainer();
container.Register(
Component.For<Bar>().ImplementedBy<Bar>().LifestyleTransient(),
Component.For<IFoo>().ImplementedBy<Foo>().LifestyleTransient(),
Component.For<IFooFactory>().AsFactory());
container.AddFacility<TypedFactoryFacility>();
var bar = container.Resolve<Bar>();
bar.DoBar();
}
}

关于c# - Windsor TypedFactoryFacility 坏了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20382532/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com