2017-04-12 1 views
1

J'ai le prochain problème, je ne comprends pas pourquoi ce code ne fonctionne pas je pense est parce que je ne pas injecter la classe de constructeur par autofac mais je ne sais pas comment cela, peut nous aider à faire que le meilleur moyen? Avant d'ajouter le générateur ce travail si je commente le code du générateur dans le travail de service.autofac instance une classe dans le constructeur

Ceci est mon code:

J'ai un contrôleur de classe qui appellent un SERV:

public class ZonesController : Controller 
{ 
    private IZoneService zoneService; 

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

    [HttpGet] 
    //Do work 
} 

C'est le service et l'interface:

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 
} 

Le générateur invoque classe ohter, usines:

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); 
     } 
    } 

Factory:

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); 
    } 
} 

Et enfin mon conteneur:

//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>(); 
    } 
} 

Répondre

1

Vous avez manqué d'ajouter à votre méthode Load les éléments suivants:

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

Vous avez raison, merci beaucoup! !!, Profitez-en, vous savez d'une manière que vous pouvez injecter automatiquement des usines, des respositories et du service ou c'est le seul moyen. Merci encore. –

+1

Vous êtes les bienvenus! Pour autant que je sache, c'est la seule façon .. – Christos