簡體   English   中英

C#中的接口和類

[英]interfaces and classes in C#

我收到以下錯誤:

test.Services.JobService'不包含帶0個參數的構造函數。

這是代碼:

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,
}

您需要在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容器,因為您的代碼遵循Inversion of Control原則(可能您甚至不知道這一點)。

采用

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

因為否則您的JobService沒有IRepository實例,並且當您嘗試在JobService使用您的存儲庫時將拋出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;
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM