2017-07-07 1 views
1

Bitte beachten Sie den Code unten:Instanziierungsanwendung Typen AutoMapper mit einem DI-Container mit

public class Test : ITest 
    { 
     public ITest2 _iTest2; 
     public int _id; 
     public string _name; 

     public Test(ITest2 test2) 
     { 
      _iTest2 = test2; 
     } 
    } 

    public interface ITest 
    { 
    } 

    public class Test2 : ITest2 
    { 
    } 

    public interface ITest2 
    { 

    } 

    public class Test3 : ITest3 
    { 
     public int _id; 
     public string _name; 
    } 

    public interface ITest3 
    { 

    } 

Ich habe folgende in meinem Global.asax:

Mapper.Initialize(m => 
      { 
m.CreateMap<DataLayer.Test3, BusinessLayer.Test>().ConstructUsing(opt => new BusinessLayer.Test(new BusinessLayer.Test2())); 
}); 

ich die Typen in meinem Client-App abbilden Doing this:

cfg.CreateMap<DataLayer.Test3, BusinessLayer.Test>().ConstructUsing(opt => new BusinessLayer.Test(new BusinessLayer.Test2())); 

Wie kann ich die Typen mit Castle Windsor zuordnen, anstatt das neue Schlüsselwort für Test verwenden zu müssen und Test2?

las ich eine andere Antwort und schlug jemand vor, dies zu tun:

public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 

     container.Register(Types.FromAssembly(Assembly.GetExecutingAssembly()).BasedOn(typeof(IValueResolver<,,>))); 
     // container.Register(Types.FromAssembly(Assembly.GetExecutingAssembly()).BasedOn<IValueResolver>()); 
     container.Register(Types.FromThisAssembly().BasedOn<Profile>().WithServiceBase()); 
     var profiles = container.ResolveAll<Profile>(); 

     // Add your list of profiles to the mapper configuration here 
     Mapper.Initialize(m => { 
      m.ConstructServicesUsing(container.Resolve); 
      profiles.ToList().ForEach(p => m.AddProfile(p)); 
     }); 

     // I'm not sure about this as I haven't used AutoMapper for a while, 
     // but I assume you want to resolve the static mapper instance 
     container.Register(Component.For<IMapper>().Instance(Mapper.Instance)); 
    } 

Muss ich dies tun:

cfg.CreateMap<DataLayer.Test3, BusinessLayer.Test>().ConstructUsing(opt => new BusinessLayer.Test(new BusinessLayer.Test2())); 

oder sollten die Typen zur Karte unter Verwendung dieser AutoMapper Lage:

cfg.CreateMap<DataLayer.Test3, BusinessLayer.Test>() 
+0

der obigen Konfiguration tatsächlich zu verwenden, was der Code sagt, ist: „Wenn Sie wollen, erstelle einen neuen Service, hol dir den Windsor Container ". Kurz vor der Verwendung der [Service Locator Anti-Pattern] (http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern/) ist etwas wie das wahrscheinlich der Weg zu gehen. – stuartd

+0

@stuartd, welche AutoMapper-Konfiguration ist erforderlich, um den oben genannten Code zu erhalten, z. B. Castle Windsor und AutMapper? – w0051977

+0

Sorry, es ist zu lange her, seit ich das letzte Mal Castle benutzt habe, um mich an die Spitze meines Kopfes zu erinnern. – stuartd

Antwort

1

Damit AutoMapper Windsor zum Erstellen des Zieltyps verwendet, müssen Sie zwei Dinge konfigurieren:

  1. AutoMapper Sagen Dienste zu konstruieren Windsor mit
  2. AutoMapper Tell (pro-Mapping)

    var container = new WindsorContainer(); 
    
        Mapper.Initialize(m => 
        { 
         m.ConstructServicesUsing(container.Resolve); 
    
         m.CreateMap<Test3, ITest>().ConstructUsingServiceLocator(); // This is important! 
    
        }); 
    
        container.Register(Component.For<ITest>().ImplementedBy<Test>()); 
        container.Register(Component.For<ITest2>().ImplementedBy<Test2>()); 
        container.Register(Component.For<ITest3>().ImplementedBy<Test3>()); 
    
        var test3 = new Test3(); 
        var test1 = Mapper.Instance.Map<Test3, ITest>(test3); 
    
Verwandte Themen