2017-04-12 24 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

相关问题