私は工場施設に少し慣れていないので、私がやっていることがばかげている場合はご容赦ください. コンテナの登録は次のとおりです。
_container = new WindsorContainer(new XmlInterpreter());
_container.AddFacility<TypedFactoryFacility>();
_container.Register(Component
.For<ITypedFactoryComponentSelector>()
.ImplementedBy<CustomTypedFactoryComponentSelector>());
_container.Register(
Component.For<ICalcService>()
.ImplementedBy<CalcService>()
.Named("Base")
.LifeStyle.Transient,
Component.For<ICalcService>()
.ImplementedBy<AverageCalcService>()
.Named("Average")
.LifeStyle.Transient,
Component.For<ICalcServiceFactory>()
.AsFactory(c => c.SelectedWith(new CustomTypedFactoryComponentSelector())));
_container.Register(
Component.For<IEventAggregator>()
.ImplementedBy<EventAggregator>()
.LifeStyle.Singleton);
次に、工場から解決します(構成から読み取ったこれらの多くを構築するため、テキスト文字列で作成します)
_factory = _container.Resolve<ICalcServiceFactory>();
var averageCalc = _factory.GetByType("Average");
(例えば)
私が困惑しているのはこれです:すべての計算オブジェクトに次のような基本インスタンスを与えようとすると:
public abstract class BaseCalcService : ICalcService
{
protected readonly IEventAggregator EventAggregator;
public BaseCalcService(IEventAggregator eventAggregator)
{
EventAggregator = eventAggregator;
}
...
そして、このように派生します
public class AverageCalcService : BaseCalcService
{
public AverageCalcService(IEventAggregator eventAggregator) : base(eventAggregator)
{
}
...
次に、デフォルトのコンストラクターがないことを CW バーフします。
質問: ファクトリを使用して calc オブジェクトを構築する場合、EventAggregator インスタンスの注入 (自動) を許可するようにファクトリ機能を設定するにはどうすればよいですか?
前もって感謝します。
編集: ここに私の CustomTypedFactoryComponentSelector があります:
public class CustomTypedFactoryComponentSelector : DefaultTypedFactoryComponentSelector
{
protected override string GetComponentName(MethodInfo method, object[] arguments)
{
if (method.Name == "GetByType" && arguments.Length == 1 && arguments[0] is string)
{
return (string)arguments[0];
}
return base.GetComponentName(method, arguments);
}
}
編集: EventAggregator はこちらです。特にない。
インターフェース
public interface IEventAggregator
{
void SendMessage<T>(T message) where T : IEvent;
void SendMessage<T>() where T : IEvent, new();
void AddListener(IListenTo listener);
void RemoveListener(IListenTo listener);
}
そして、俳優
public EventAggregator(SynchronizationContext context)
{
_context = context;
}