首页 / C# / C#-策略工厂模式的自动配置(已解决)
C#-策略工厂模式的自动配置(已解决)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#-策略工厂模式的自动配置(已解决),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3026字,纯文字阅读大概需要5分钟。
内容图文
给出以下解析IProcessor实例的代码
如何让autofac为我的服务使用者解决并创建这些服务?
我需要使用autofac才能使用此功能,或者需要与此功能类似的东西才能为相应的商品创建相关策略.这些策略需要以正确解决其依赖性的方式来创建.
理想情况下,这需要在应用程序的COMPOSITION ROOT中发生.
下面的代码未正确使用容器来构建实例.实际代码中的StrategyA和StrategyB将具有自己的依赖性.当处置消费者时,也将需要处置它们.
容器
我已经尝试过此操作,但收到一条错误消息,指出解析操作已经发生.
var builder = new Autofac.ContainerBuilder();
builder.RegisterType<StrategyA>().As<IProcessor>().Keyed<IProcessor>(typeof(ItemA).Name).InstancePerDependency();
builder.RegisterType<StrategyB>().As<IProcessor>().Keyed<IProcessor>(typeof(ItemB).Name).InstancePerDependency();
builder.Register<Func<string, IProcessor>>(c => (s) => c.ResolveKeyed<IProcessor>(s));
builder.RegisterType<MyServiceConsumer>().As<IConsumer>();
var container = builder.Build();
var consumer = container.Resolve<IConsumer>().DoStuff(new ItemA()).Dump();
服务消费者.
public class MyServiceConsumer : IConsumer {
Func<string, IProcessor> processor;
public MyServiceConsumer(Func<string, IProcessor> processor) {
//processor.Dump("px");
this.processor = processor;
}
public string DoStuff(IItem item) {
return processor(item.GetType().Name).ProcessItem(item);
}
}
这是接口.
public interface IConsumer { string DoStuff(IItem item); }
public interface IProcessor { string ProcessItem(IItem item); }
public interface IItem { string Name { get; } }
public interface IItemStrategy<in T> : IProcessor where T : IItem { string ProcessItem(T item); }
这是具体的类.
public class ItemA : IItem { public string Name { get { return "A"; } } public string UniqueA { get { return "+ UA"; } } }
public class ItemB : IItem { public string Name { get { return "B"; } } public string UniqueB { get { return "+ UB"; } } }
战略实施.
我希望我正确地应用了模式,理想情况下我确实想要强类型策略吗?
public class StrategyA : IItemStrategy<ItemA> {
string IProcessor.ProcessItem(IItem item) { Debug.Assert(item is ItemA); return this.ProcessItem((ItemA)item); }
public string ProcessItem(ItemA item) { return "PA " + item.Name + item.UniqueA; }
}
public class StrategyB : IItemStrategy<ItemB> {
string IProcessor.ProcessItem(IItem item) { Debug.Assert(item is ItemB); return this.ProcessItem((ItemB)item); }
public string ProcessItem(ItemB item) { return "PB " + item.Name + item.UniqueB; }
}
解决方法:
我已经知道了.
提示是在这里autofac registration issue in release v2.4.5.724
var builder = new Autofac.ContainerBuilder();
builder.RegisterType<StrategyA>().As<IProcessor>().Keyed<IProcessor>(typeof(ItemA).Name).InstancePerDependency();
builder.RegisterType<StrategyB>().As<IProcessor>().Keyed<IProcessor>(typeof(ItemB).Name).InstancePerDependency();
builder.Register<Func<string, IProcessor>>(c => {
var ctx = c.Resolve<IComponentContext>();
return (s) => ctx.ResolveKeyed<IProcessor>(s);
});
builder.RegisterType<MyServiceConsumer>().As<IConsumer>();
var container = builder.Build();
var consumer = container.Resolve<IConsumer>().DoStuff(new ItemB()).Dump();
内容总结
以上是互联网集市为您收集整理的C#-策略工厂模式的自动配置(已解决)全部内容,希望文章能够帮你解决C#-策略工厂模式的自动配置(已解决)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。