1

我正在尝试创建一个通用任务层(在我的项目中称为 AppServ)来与我的通用存储库进行交互。这是我第一次深入研究泛型,并且在将值传递给泛型类中的泛型方法参数时遇到问题:

Base App Services 类(由特定的应用程序服务类继承并调用通用存储库):

public class BaseAppServ<T> : IBaseAppServ<T> where T : class, IEntity, IAuditStamps, ICompanyFacility, new()
{
    private Repository<T> _repository;
    private T _viewModel;
    private AuditStampsViewModel _auditStamps;

    public BaseAppServ(Repository<T> repository)
    {
        _repository = repository;
        _viewModel = new T();
        _auditStamps = new AuditStampsViewModel();
    }

这是我的特定 AppServ 类(继承 BaseAppServ)

public class ManageItemsAppServ : BaseAppServ<ManageItemsAppServ>, IEntity, IAuditStamps, ICompanyFacility
    {

        public ManageItemsAppServ()
            : base(CallBaseConstructor())
            {

            }

            public static Repository<Item> CallBaseConstructor()
            {
                return new Repository<Item>(new InventoryMgmtContext());
            }

我在构造函数或 ManageItemsAppServ 中遇到问题,特别是在 base(CallBaseConstructor()) 行中。它给出了一个错误:

Argument 1: cannot convert from 'OTIS.Data.Repository<OTIS.domain.InventoryMgmt.Item>' to 'OTIS.Data.Repository<OTIS.AppServ.InventoryMgmt.ManageItemsAppServ>'

我想我知道为什么会发生这种情况(因为当我继承 BaseAppServ 时,我指定了 ManageItemsAppServ 类型的 T 并且为整个 BaseAppServ 类设置了 T 的类型......对吗?)

那么如何为正在寻找类型 Respository 的构造函数调用重新定义 T 呢?

编辑:所以我认为我需要在 BaseAppServ 类中添加第二个通用参数,例如(注意我限制输入存储库的 U):

public class BaseAppServ<T, U> where U : Repository<U>, IBaseAppServ<T> where T : class, IEntity, IAuditStamps, ICompanyFacility, new()
    {
        private Repository<U> _repository;
        private T _viewModel;
        private AuditStampsViewModel _auditStamps;

        public BaseAppServ(Repository<U> repository)
        {
            _repository = repository;
            _viewModel = new T();
            _auditStamps = new AuditStampsViewModel();
        }

这似乎是正确的道路,现在唯一的错误是:

Inconsistent accessibility: constraint type 'OTIS.AppServ.IBaseAppServ<T>' is less accessible than 'OTIS.AppServ.BaseAppServ<T,U>'

这与 BaseAppServ 类声明的顺序/语法有关。应该是什么?

4

1 回答 1

1

您正在尝试将 aRepository<Item>作为构造函数参数传递给Repository<ManageItemsAppServ>预期的 a 。

请注意,即使Item从 this 继承ManageItemsAppServ也不是有效操作,因为泛型类不能是协变或逆变的。

所以,简而言之,确保传入确切的类型,或者使用协变的接口(接口是否可以协变取决于它上面的方法)。

编辑:

根据您的编辑,您可能想要这样的东西:

public class BaseAppServ<TModel, TItem>: IBaseAppServ<TModel>
            where TItem : class, IEntity 
            where TModel: ICompanyFacility, new()
{
    private Repository<TItem> _repository;
    private TModel _viewModel;
    private AuditStampsViewModel _auditStamps;

    public BaseAppServ(Repository<TItem> repository)
    {
        _repository = repository;
        _viewModel = new TModel();
        _auditStamps = new AuditStampsViewModel();
    }
于 2012-12-22T01:03:23.990 回答