C# StructureMap StructureMap.StructureMapbuildPlaneException,避免对象工厂
我偶然发现了一个使用StructureMap的CQR示例 然而,该示例使用了ObjectFactory,这是我想要避免的C# StructureMap StructureMap.StructureMapbuildPlaneException,避免对象工厂,c#,winforms,structuremap,cqrs,C#,Winforms,Structuremap,Cqrs,我偶然发现了一个使用StructureMap的CQR示例 然而,该示例使用了ObjectFactory,这是我想要避免的 var cmdHandler = handlers.Select(handler => (ICommandHandler<T>)ObjectFactory.GetInstance(handler)).FirstOrDefault(); var cmdHandler=handlers.Select(handler=> (ICommandHandle
var cmdHandler = handlers.Select(handler =>
(ICommandHandler<T>)ObjectFactory.GetInstance(handler)).FirstOrDefault();
var cmdHandler=handlers.Select(handler=>
(ICommandHandler)ObjectFactory.GetInstance(handler)).FirstOrDefault();
此代码可以在->Utils->StructureMapCommandHandlerFactory.cs中找到
我想在WinForms上试用这个示例,但不使用ObjectFactory。
不幸的是,我遇到了一个例外:
类型的未处理异常
“StructureMap.StructureMapBuildPlaneException”在中发生
StructureMap.dll
其他信息:无法创建混凝土的构建计划
键入CQRS.Core.Commands.CreateItemCommand
我当前的配置是
private IContainer container;
public StructureMapCommandHandlerFactory()
{
this.container = new Container(_ => {
_.For<ICommandHandler<CreateItemCommand>>().Use<CreateItemCommandHandler>();
_.Policies.ConstructorSelector<ThingCtorRuleCommand>();
});
}
public class ThingCtorRuleCommand : IConstructorSelector
{
public ConstructorInfo Find(Type pluggedType, DependencyCollection dependencies, PluginGraph graph)
{
if (!pluggedType.CanBeCastTo<Command>()) return null;
var ctr = pluggedType.GetConstructor(new[] { typeof(IRepository<DiaryItem>) });
return ctr;
}
}
public class CreateItemCommandHandler : ICommandHandler<CreateItemCommand>
{
private IRepository<DiaryItem> _repository;
public CreateItemCommandHandler(IRepository<DiaryItem> repository)
{
_repository = repository;
}
public void Execute(CreateItemCommand command)
{
...
}
}
专用集装箱;
公共结构MapCommandHandlerFactory()
{
this.container=新容器(=>{
_.For().Use();
_.Policies.ConstructorSelector();
});
}
公共类ThingTorRuleCommand:IConstructorSelector
{
公共构造函数信息查找(类型pluggedType、DependencyCollection dependencies、PluginGraph图)
{
如果(!pluggedType.CanBeCastTo())返回null;
var ctr=pluggedType.GetConstructor(新[]{typeof(IRepository)});
返回ctr;
}
}
公共类CreateItemCommandHandler:ICommandHandler
{
私人IRepository_存储库;
公共CreateItemCommandHandler(IRepository存储库)
{
_存储库=存储库;
}
public void Execute(CreateItemCommand命令)
{
...
}
}
和对象实例化:
var cmdHandler = container.GetInstance<CreateItemCommand>();
var cmdHandler = container.GetInstance<CreateItemCommandHandler>();
var cmdHandler=container.GetInstance();
问题:
1.我应该如何配置结构映射以获取对象CreateItemCommandHandler?
2.我真的不明白对象是如何用值实例化的?
将简单参数传递给构造函数如下所述:
但如何将存储库对象传递给
public CreateItemCommandHandler(IRepository<DiaryItem> repository)
{
_repository = repository;
}
public CreateItemCommandHandler(IRepository存储库)
{
_存储库=存储库;
}
我希望有人能帮我一点忙
编辑:
经过调查,我发现了错误。将容器配置更改为此配置时:
private IContainer container;
public StructureMapCommandHandlerFactory()
{
_.For<ICommand>().Use<Command>();
_.For<ICommandHandler<CreateItemCommand>>().Use<CreateItemCommandHandler>();
_.For<IRepository<DiaryItem>>().Use(new Repository<DiaryItem>());
_.Policies.ConstructorSelector<ThingCtorRuleCommand>();
}
专用集装箱;
公共结构MapCommandHandlerFactory()
{
_.For().Use();
_.For().Use();
_.For().Use(新存储库());
_.Policies.ConstructorSelector();
}
和对象实例化:
var cmdHandler = container.GetInstance<CreateItemCommand>();
var cmdHandler = container.GetInstance<CreateItemCommandHandler>();
var cmdHandler=container.GetInstance();
它起作用了
然而,我仍然不知道如何在初始化时将值传递给构造函数。
由于ObjectFactory已经过时,我的解决方案是正确的,还是仅仅是它意外工作的解决方案?:)
编辑2
我找到了设置参数的方法:
EventBus eventBus = new EventBus(new StructureMapEventHandlerFactory());
IEventStorage storage = new InMemoryEventStorage(eventBus);
Repository<DiaryItem> repository = new Repository<DiaryItem>(storage);
var cmdHandler = container.With<IRepository<DiaryItem>>(repository).With<IEventStorage>(storage).GetInstance<ICommandHandler<CreateItemCommand>>();
EventBus EventBus=new EventBus(new StructureMapEventHandlerFactory());
IEventStorage storage=新的内存ventstorage(eventBus);
存储库=新存储库(存储);
var cmdHandler=container.With(repository).With(storage.GetInstance();
所以
With(存储库)。With(存储)
这就是诀窍
更多信息请点击此处:
还有一个问题我自己还没有回答:由于ObjectFactory已经过时,它是我的解决方案中正确的,还是仅仅是它意外工作的一个?:)请帮忙