1

Я этого нужно просто схватившись с основами StructureMap (IoC) и пытаюсь межтереть демо Ярче, который можно найти здесьIntergrating (Ian бочары) Ярче с StructureMap

https://iancooper.github.io/Paramore/QuickStart.html

С StructureMap в рамках проекта MVC.

Проблема, которую я имею прорабатывает, что необходимо передать в объект завода StructureMap по сборке, она возвращается

Я в настоящее время имеют следующую ошибку

An exception of type 'System.ArgumentOutOfRangeException' occurred in StructureMap.dll but was not handled in user code 

Additional information: Specified argument was out of the range of valid values. 

завод Handler

public class SimpleHandlerFactory : IAmAHandlerFactory 
    { 
     public IHandleRequests Create(Type handlerType) 
     { 
      return new GreetingCommandHandler(); 
     } 

     public void Release(IHandleRequests handler) 
     { 

     } 
    } 

CommandHandler

public class GreetingCommandHandler : RequestHandler<GreetingCommand> 
    { 
     public override GreetingCommand Handle(GreetingCommand command) 
     { 
      Debug.Print("This is the trace for the command : {0}", command.Name); 
      return base.Handle(command); 
     } 
    } 

И мой StructureMap Dependency Scope

public IHandleRequests<T> GetExecutorFor<T>() where T : class, IRequest 
     { 
      return this.Container.GetAllInstances<IHandleRequests<T>>().FirstOrDefault(); // GetInstance() throws exception if more than one found 
     } 

А потом на IoC.cs

public static IContainer Initialize() { 
     ObjectFactory.Initialize(x => 
        { 
         x.Scan(scan => 
           { 
            scan.TheCallingAssembly(); 
            scan.WithDefaultConventions(); 
           }); 
        // x.For<IHandleRequests<IRequest>>().Use<IHandleRequests<IRequest>>(); 
// So this is where I was going wrong I should of been doing 
x.For<IHandleRequests<GreetingCommand>>().Use<GreetingCommandHandler>(); 
        }); 
     return ObjectFactory.Container; 
    } 

Заранее спасибо,

Martyn

ответ

1

Для решения GreetingCommandHandler вы должны зарегистрироваться что в вашем IContainer специально, потому что он не будет разрешать использование DefaultConventions.

For<IHandleRequests<GreetingCommand>().Use<GreetingCommandHandler>(); 

Должно работать для вас.

Для всех других конкретных реализаций вам придется делать то же самое.

+0

Perfect @pedro это именно то, что было необходимо: D был просто немного толстым после долгого уик-энда –