2014-01-25 51 views
2

我得到以下錯誤:接口和類

test.Services.JobService' does not contain a constructor that takes 0 arguments.

這是代碼:

JobService.cs:

namespace TesteUltrafan.Services 
{ 
    public class JobService 
    { 
     private readonly IRepository _repository; 

     public JobService(IRepository repository) 
     { 
      _repository = repository; 
     } 

     public Job CreateJobBanker() 
     { 
      var banker = new Job(); 

      string id = Guid.NewGuid().ToString("N"); 

      Console.WriteLine("Novo job banker id: {0}", id); 

      banker.Id = id; 
      banker.Type = JobType.Banker; 
      banker.CreatedAt = DateTime.Now; 

      Console.WriteLine("Salvando job banker id: {0}", id); 

      Job jobBanker = _repository.SaveJob(banker); 

      return jobBanker; 
     } 
    } 
} 

的Program.cs的:

public class Program 
{ 
    public static void Main() 
    { 
     var jobService = new JobService(); <---- Here is the error. 

     Console.WriteLine("Creating job banker, creation:"); 

     Job jobBanker = jobService.CreateJobBanker(); 

     Console.WriteLine("Job banker: {0}", jobBanker); 
    } 
} 

Job.cs:

public class Job 
{ 
    public string Id { get; set; } 
    public DateTime CreatedAt { get; set; } 
    public JobType Type { get; set; } 
} 

JobType.cs:

public enum JobType 
{ 
    Actor = 1, 
    Agricultural = 2, 
    Banker = 3, 
    EngineerCivil = 4, 
    Another = 5, 
} 
+0

默認構造丟失。 –

+0

這是IR知識庫: public interface IRepository Job SaveJob(Job job); } – Vinicius

回答

8

您可能需要創建一個在您JobService類參數的構造函數(我不會做的,因爲那麼你的類將無法正常工作 - 將有沒有參考任何存儲庫),或者最好在構造此實例時傳遞Repository實例作爲參數。

因此,代碼最好是這樣的:

public class Program 
{ 
    public static void Main() 
    { 
     var jobService = new JobService(new Repository()); 

     Console.WriteLine("Creating job banker, creation:"); 

     Job jobBanker = jobService.CreateJobBanker(); 

     Console.WriteLine("Job banker: {0}", jobBanker); 
    } 
} 

Repository應該是實現IRepository接口的類。沒有通過這個實例,你的CreateJobBanker將無法​​正常工作。

儘管建議使用一些IoC容器,因爲你的代碼遵循控制反轉原理(可能你甚至沒有意識到這一點)。

0

使用

var jobService = new JobService(new Repository()); 

,否則你JobService有沒有一個IRepository實例,將拋出一個NullReferenceException當您嘗試使用內JobService你的資料庫。

在你的代碼,你不給它一個IRepository參數初始化JobService,讓你的代碼編譯你需要定義JobService構造函數,如果你想這樣做不具有IRepository說法:

public class JobService 
{ 
    private readonly IRepository _repository; 

    // New Constructor will make _repository null 
    public JobService() 
    {   
    } 

    public JobService(IRepository repository) 
    { 
     _repository = repository; 
    } 

    public Job CreateJobBanker() 
    { 
     var banker = new Job(); 

     string id = Guid.NewGuid().ToString("N"); 

     Console.WriteLine("Novo job banker id: {0}", id); 

     banker.Id = id; 
     banker.Type = JobType.Banker; 
     banker.CreatedAt = DateTime.Now; 

     Console.WriteLine("Salvando job banker id: {0}", id); 

     // NullReferenceException if you define a parameterless constructor 
     Job jobBanker = _repository.SaveJob(banker); 

     return jobBanker; 
    } 
} 

現在你可以建,這在兩個方面:

var jobService = new JobService(); 

var jobService = new JobService(new Repository()); 

IRepository實現:

public class Repository: IRepository 
{ 
    private MyDbEntities context = new MyDbEntities(); 

    public Job SaveJob(Job job) 
    { 
     // assuming Entity Framework 
     var id = job.Id; 
     if (context.Jobs.Any(e => e.Id == id)) 
     { 
      context.Jobs.Attach(job); 
      context.ObjectStateManager.ChangeObjectState(jobs, EntityState.Modified); 
     } 
     else 
     { 
      context.Jobs.AddObject(myEntity); 
     } 

     context.SaveChanges(); 
     return job; 
    } 
} 
+0

但它給出了這個錯誤:無法創建抽象類或接口'test.Repositories的實例。IRepository' – Vinicius

+0

你需要實現IRepository。我將用一個示例實現更新我的答案。通過實現,而不是接口。你不能實例化一個接口,這就是你的第二個錯誤的含義。 –

+0

你有Skype,類似的東西?請... – Vinicius