C#中的接口和类

时间:2014-01-25 17:28:00

标签: c# class interface repository

我收到以下错误:

  

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

2 个答案:

答案 0 :(得分: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容器,因为您的代码遵循Inversion of Control原则(可能您甚至不知道这一点)。

答案 1 :(得分:0)

使用

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

因为否则您的JobService没有IRepository实例,并且当您尝试在NullReferenceException内使用您的存储库时会抛出JobService

在您的代码中,您正在初始化JobService而没有给它IRepository参数,为了让您的代码进行编译,您需要在JobService中定义一个没有{的构造函数{1}}参数如果你想这样做:

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