のインスタンスを解決する次のコードがあるとします。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; }
}