c# – 为什么Castle Windsor类型工厂在使用不同参数创建时返回相同的实例
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 为什么Castle Windsor类型工厂在使用不同参数创建时返回相同的实例,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1972字,纯文字阅读大概需要3分钟。
内容图文
我希望以下在使用typed factory facility时生成两个单独的实例.
using System;
using Castle.Facilities.TypedFactory;
using Castle.MicroKernel.Registration;
using Castle.Windsor;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
var container = new WindsorContainer();
container.AddFacility<TypedFactoryFacility>();
container.Register(Component
.For<IFactory>()
.AsFactory()
.LifestyleSingleton());
container.Register(Component
.For<IImplementation>()
.ImplementedBy<Implementation>()
.LifestylePerThread());
var factory = container.Resolve<IFactory>();
var implementation1 = factory.Create(1);
var implementation2 = factory.Create(2);
Console.WriteLine(implementation1 == implementation2);//Returns true!
Console.Read();
}
}
public interface IFactory
{
IImplementation Create(int dependency);
}
public interface IImplementation
{}
public class Implementation : IImplementation
{
private readonly int _dependency;
public Implementation(int dependency)
{
_dependency = dependency;
}
}
}
我也尝试使用参数作为引用类型来覆盖.Equals()和.GetHashCode()而不是int,但它没有区别.
我意识到我可以使用LifestyleTransient来解决这个问题,但如果我传入相同的参数,我实际上想要接收相同的实例.
解决方法:
你的期望是不正确的.
传递给工厂方法的参数是当且仅当容器中不存在所需服务的组件时将用于构造新组件的详细信息.
您的第二个请求来自同一个线程,并且是针对相同的服务,因此Windsor正确地返回已经构建的那个.
虽然吉拉德的建议是可以遵循的,但你可能仍然发现自己“打架”容器并使事情变得比他们需要的更复杂.
我建议您接受Windsor中可用的机制,它完全依赖于服务类型(接口)来区分服务.
问问自己这两个不同的实例是什么,并反映了接口方面的差异.例如也许你应该有一个IBigImplementation和ISmallImplementation?然后可以在容器中注册和配置这些不同服务的实现;你得到你想要的所有汇集/重用;并且消耗代码仍然没有意识到并且与实现细节分离.
[RANT:虽然工厂允许更大的灵活性,但我通常认为将参数用于工厂方法作为代码气味.正如您所发现的,它需要消费者对服务实现的生命周期做出假设.它还意味着控制实现细节的杠杆和开关分散在代码库中,而不是全部在容器注册代码中集中管理.
内容总结
以上是互联网集市为您收集整理的c# – 为什么Castle Windsor类型工厂在使用不同参数创建时返回相同的实例全部内容,希望文章能够帮你解决c# – 为什么Castle Windsor类型工厂在使用不同参数创建时返回相同的实例所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。