C# StructureMap StructureMap.StructureMapbuildPlaneException,避免对象工厂

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

我偶然发现了一个使用StructureMap的CQR示例

然而,该示例使用了ObjectFactory,这是我想要避免的

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已经过时,它是我的解决方案中正确的,还是仅仅是它意外工作的一个?:)请帮忙