2017-04-12 3 views
1

Ich habe das nächste Problem, ich verstehe nicht, warum dieser Code nicht funktioniert, ich denke, weil ich nicht die Klasse des Konstruktors von Autofac injizieren, aber ich weiß nicht, wie tun, können wir mir helfen, zu tun dass der bessere Weg?Autofac-Instanz eine Klasse im Konstruktor

Bevor ich den Generator hinzufüge diese Arbeit, wenn ich den Generator-Code in Servicearbeiten kommentieren.

Dies ist mein Code:

ich eine Klasse-Controller haben, die eine serv aufrufen:

public class ZonesController : Controller 
{ 
    private IZoneService zoneService; 

    public ZonesController(IZoneService zoneService) 
    { 
     this.zoneService = zoneService; 
    } 

    [HttpGet] 
    //Do work 
} 

Dies ist der Service und die Schnittstelle:

public class ZoneService : IZoneService 
{ 
    private readonly IZoneRepository zoneRepository; 
    private readonly IDtoFactory dtoFactory; 
    private readonly ZoneGenerator zoneGenerator; 

    public ZoneService(IZoneRepository zoneRepository, 
           IDtoFactory dtoFactory, 
           ZoneGenerator zoneGenerator) 
    { 
     this.zoneRepository = zoneRepository; 
     this.dtoFactory = dtoFactory; 
     this.zoneGenerator = zoneGenerator; 
    } 

    public void Add(ZoneDetailDTO zone) 
    { 
     zoneGenerator.Generate(zone); 
    } 

    //Do Work 
} 

public interface IZoneService 
{ 
    void Add(ZoneDetailDTO zone); 
    //Do Methods 
} 

Der Generator ohter Klasse aufrufen, Fabriken:

public class ZoneGenerator 
    { 
     private readonly ZoneFactory zoneFactory; 
     private readonly IZoneRepository zoneRepository; 

     public ZoneGenerator(ZoneFactory zoneFactory, IZoneRepository zoneRepository) 
     { 
      this.zoneFactory = zoneFactory; 
      this.zoneRepository = zoneRepository; 
     } 

     public void Generate(ZoneDetailDTO zoneModel) 
     { 
      var zone = zoneFactory.Create(zoneModel); 
      zoneRepository.Add(zone); 
     } 
    } 

Die Fabrik:

public class ZoneFactory 
{ 
    private readonly ZoneMapFactory zoneMapFactory; 
    private readonly ZoneScheduleFactory zoneScheduleFactory; 

    public ZoneFactory(ZoneMapFactory zoneMapFactory, 
           ZoneScheduleFactory zoneScheduleFactory) 
    { 
     this.zoneMapFactory = zoneMapFactory; 
     this.zoneScheduleFactory = zoneScheduleFactory; 
    } 

    public Zone Create(zoneDetailDTO zone) 
    { 
     var map = zoneMapFactory.Create(zone.Map.Address, zone.Map.Latitude, zone.Map.Longitude); 
     var schedule = zoneScheduleFactory.Create(zone.Schedule.StartHour, zone.Schedule.EndHour); 

     return new Zone(zone.Name, 
         zone.ProvinceId, 
         map, 
         schedule, 
         zone.Tags); 
    } 
} 

Und schließlich mein Behälter:

//method in Startup class Asp.Net Core 
public IServiceProvider ConfigureServices(IServiceCollection services) 
    { 
     services.AddSingleton(_ => Configuration); 

     // Add framework services. 
     services.AddApplicationInsightsTelemetry(Configuration); 

     services.AddMvc(); 

     var containerBuilder = new ContainerBuilder(); 
     containerBuilder.RegisterModule<DefaultModule>(); 
     containerBuilder.Populate(services); 
     var container = containerBuilder.Build(); 
     return new AutofacServiceProvider(container); 
    } 

public class DefaultModule : Module 
{ 
    protected override void Load(ContainerBuilder builder) 
    { 
     builder.RegisterType<ZoneService>().As<IZoneService>(); 
     builder.RegisterType<ZoneRepository>().As<IZoneRepository>(); 
     builder.RegisterType<ProvinceService>().As<IProvinceService>(); 
     builder.RegisterType<ProvinceRepository>().As<IProvinceRepository>(); 
     builder.RegisterType<DtoFactory>().As<IDtoFactory>(); 
    } 
} 

Antwort

1

Sie haben verpasst Ihr Load Methode folgendes hinzuzufügen:

builder.RegisterType<ZoneGenerator>().AsSelf(); 
builder.RegisterType<ZoneFactory>().AsSelf(); 
builder.RegisterType<ZoneMapFactory>().AsSelf(); 
builder.RegisterType<ZoneScheduleFactory>().AsSelf(); 
+0

Sie haben Recht, vielen Dank! !!, Nutzen Sie, Sie wissen, wie Sie automatisch Fabriken, Repositories und Service injizieren können oder nur so. Danke noch einmal. –

+1

Sie sind herzlich willkommen! Soweit ich weiß, ist dies der einzige Weg. – Christos

Verwandte Themen