2017-04-12 31 views
1

類我有一個問題,我不明白爲什麼這個代碼不工作我想是因爲我不通過autofac注射液類的構造函數,但我不知道如何做到這一點,可我們來幫我做那更好的方法?autofac比如在構造

之前我添加了發電機這項工作,如果我評論在服務工作中生成代碼。

這是我的代碼:

我有一個類控制器,可調用SERV:

public class ZonesController : Controller 
{ 
    private IZoneService zoneService; 

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

    [HttpGet] 
    //Do work 
} 

這是服務和接口:

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 
} 

發電機援引ohter類,工廠:

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

工廠:

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

最後我的容器:

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

回答

1

你已經錯過了添加到您的Load方法如下:

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

你是正確的,非常感謝! !!,充分利用,你知道一些方式,你可以自動注入工廠,respositories和服務或者這是唯一的出路。再次感謝。 –

+1

非常歡迎!據我所知這是唯一的方法.. – Christos

相關問題