2

我不知道如何正确管理 C# 中的接口。我的目标是为我的业务层服务创建一个抽象类,该类具有一些通用方法(如 Save()、Dispose()),它们调用不同的 DAL 存储库方法。我希望避免在我的所有服务中重复以下内容:

public Save() 
{
   repository.Save();
}

我有一个类似的场景:

界面

namespace Common
{
    public interface IRepository
    {
        void Save;
        void Dispose;
    }
}

达尔

namespace DAL
{
    public Repository : IRepository
    {
        public void Save() {};
        public void Dispose() {};
        public void Add() {}
    }
}

提单

namespace BL
{
    public abstrac BaseService
    {
        protected IRepository repository;
        protected BaseService(IRepository repo)
        {
            repository = repo;
        }

        public Save() 
        {
            repository.Save();
        }
    }

    //...

    //Tentative 1
    public Service : BaseService
    {
        private Repository rep;

        public Service()
            : base(new DAL.Repository())
        {
            rep = base.repository; // ERROR: cannot convert IRepository to Repository
        }
    }
}

我也试过这个:

//Tentative 2
public Service : BaseService
{
    private IRepository rep;

    public Service()
        : base(new DAL.Repository())
    {
        rep = base.repository; // OK
    }

    public void Add()
    {
        rep.Add() // ERROR: IRepository doesn't contain a definition for 'Add'
    }
}

我知道我可以在接口中定义我想使用的所有方法,但是我将不得不处理泛型类型的很多问题,而且,正如你应该从我的问题中理解的那样,我在 C# 和我希望避免复杂性是可能的,至少我会更专业:)

4

3 回答 3

3

首先,我认为您与您的成员发生了名字冲突 IRepository rep.

尝试使用 DAL.IRepository rep

您收到错误的原因是您已将“添加”定义为“存储库”独有的东西。您的成员变量是一个“IRepository”,允许您将任何实现“IRepository”的东西放到它上面。

仅仅因为您可以将存储库放入其中,并不意味着其中的所有内容都将成为存储库。(想想看起来不错,手指和拇指,所有的拇指都是手指,但不是所有的手指都是拇指)

如果您需要在任何存储库上调用 add ,则将其添加到界面中。否则,您需要决定该成员应该是 IRepository 还是 Repository。

或者,您可以使用

    Repository myRep = rep as Repository;
    if(rep!=null)
    {
       myRep.Add();
       ...
       profit();
    }
于 2013-01-31T10:18:43.533 回答
1
public Service()
        : base(new DAL.Repository())
    {
           rep = (Repository)base.repository;

    }

这样,您将获得 Add() 服务,它不是 IRepository 的一部分,而是扩展类中的较新实现。

于 2013-01-31T10:15:00.193 回答
0

看到您的主要问题是该Add方法缺乏可访问性,并且无论如何这是一种相对常见的方法,我首先建议将其添加到您的IRepository中,所以它看起来像这样:

public interface IRepository
{
    void Add();
    void Save();
    void Dispose();
}

然后,您将在继承自IRepository. 现在,可以理解的是,您可能希望能够访问Repository. 为了解决这个问题,您可以做的是让您BaseService接受一个通用存储库:

public BaseService<T> where T : IRepository
{
    protected T repository { get; set; }
    protected BaseService(T repo)
    {
        repository = repo;
    }
}

然后服务看起来像这样

public UserService : BaseService<UserRepository>
{
    public UserService() : base(new DAL.UserRepository())
    {
        // base.Repository is now a UserRepository.
    }    
}

通过这个实现,您UserService将能够访问所有UserRepository公开的方法,因为它是使用泛型进行强类型化的。希望这可以帮助。

于 2013-01-31T10:27:17.733 回答