首页 > 解决方案 > 没有给出与所需形式参数“映射器”相对应的参数

问题描述

我确定这是一个基本的 OOP 问题,但我正在尝试使用 ContactsRepository 作为基类并在类 OrganizationRepository 中使用其方法,但出现错误:没有给出与所需的形式参数“映射器”相对应的参数

//OrganizationRepository 类

public class OrganizationRepository : ContactsRepository, IOrganizationRepository
    {

        #region fields   
        private readonly GreyWorldDB_DevEntities _context;
        private readonly IMapper _mapper;
        private readonly UserManagement _userManagement;
        #endregion


        #region Ctor
        public OrganizationRepository(IMapper mapper, GreyWorldDB_DevEntities context, UserManagement userManagement)
        {
            _mapper = mapper;
            _context = context;
            _userManagement = userManagement;
        }
        #endregion

        #region  Actions

            //Action methods
        #endregion

        #region Private Methods

            //private methods
        #endregion
    }

//ContactsRepository 类

public class ContactsRepository : IContactsRepository
    {

        #region fields   
        private readonly GreyWorldDB_DevEntities _context;
        private readonly IMapper _mapper;
        private readonly UserManagement _userManagement;
        #endregion

        #region Ctor
        public ContactsRepository(IMapper mapper, GreyWorldDB_DevEntities context, UserManagement userManagement)
        {
            _mapper = mapper;
            _context = context;
            _userManagement = userManagement;
        }
        #endregion

        #region  Actions

            //Action methods
        #endregion

        #region Private Methods


        #endregion

    }

没有给出与“ContactsRepository.ContactsRepository(IMapper, GreyWorldDB_DevEntities, UserManagement)”所需的形式参数“mapper”相对应的参数

标签: c#ooprepository-pattern

解决方案


创建派生类的实例时,会在派生类的构造函数运行之前调用基类的构造函数。类之间的构造函数不必相同,但如果基类的构造函数不是无参数的,您仍然需要将它需要的参数传递给它:

public class BaseClass
{
    public BaseClass(string name)
    {
    }
}

public class DerivedClass: BaseClass
{
    public DerivedClass() : base("test")
    {
    }
}

另外,我不确定您为什么要在基类和派生类中重新定义相同的私有字段。相反,您应该将它们protected放在基类中,让基类构造函数填充它们,然后简单地从派生类传递它们。您的代码最终应该看起来像这样:

public class ContactsRepository : IContactsRepository
{
    protected readonly GreyWorldDB_DevEntities _context;
    protected readonly IMapper _mapper;
    protected readonly UserManagement _userManagement;

    public ContactsRepository(IMapper mapper, GreyWorldDB_DevEntities context, UserManagement userManagement)
    {
        _mapper = mapper;
        _context = context;
        _userManagement = userManagement;
    }
}

public class OrganizationRepository : ContactsRepository, IOrganizationRepository
{
    public OrganizationRepository(IMapper mapper, GreyWorldDB_DevEntities context, UserManagement userManagement)
        : base(mapper, context, userManagement)
    {
    }
}

推荐阅读