考慮下面的代碼解析如何獲取autofac解決創造這些對我的服務消費方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; }
}
每次我註冊一個Func時,都會咬我。幸運的是,異常消息是*非常*描述性的。 –