尝试在基类中创建泛型方法

时间:2013-12-30 16:15:03

标签: c# generics service-locator

我对代码中使用泛型并尝试使用它们相当新,并且可以使用一些帮助。我正在使用C#。

所以我正在玩一些新的设计概念,我试图使用服务定位器模式与存储库模式相结合,使我的数据/业务层更少耦合,更容易升级。

我的数据/业务层中有两个定位器: 存储库定位器,它允许我表示我想要的存储库的接口并获取该对象的实例。 一个实例定位器,它允许我表示我想要的对象的接口并获取该对象的新实例。

大部分工作都很好,除了一个挂起,在我的所有业务对象类中,我有两个方法被放入“剪贴板继承”,称为GetRepository()和GetInstance()。这些方法中的每一种都只有一个区别,即它们正在寻找的接口。

例如,我的UserManagement类有以下方法:

protected IUserRepository GetRepository()
{
        IServiceLocator locator = new ServiceLocator();
        IUserRepository repository = locator.GetService<IUserRepository>();
        return repository;
}

protected IUser GetInstance()
{
    IInstanceLocator locator = new InstanceLocator();
        IUser instance = locator.GetInstance<IUser>();
        return instance;
}

我正在寻找一种方法来使它更通用,并且想为所有业务对象构建一个继承的类,但在其中使用这些方法。但我希望用泛型定义接口。有没有办法可以使用泛型来做到这一点。

2 个答案:

答案 0 :(得分:2)

如果我理解了你想要创建的基类之后的内容:

public abstract BaseClass<T1, T2>
{ 
   protected T1 GetRepository()
   {
        IServiceLocator locator = new ServiceLocator();
        T1 repository = locator.GetService<T1>();
        return repository;
   }

   protected T2 GetInstance()
   {
        IInstanceLocator locator = new InstanceLocator();
        T2 instance = locator.GetInstance<T2>();
        return instance;
   }

}

然后你可以这样使用它:

public ChildClass : BaseClass<IUserRepository, IUser>
{
    public ChildClass()
    {
       IUserRepository userRepos = GetRepository();
       IUser user = GetInstance();

    }
}

public ChildClass2 : BaseClass<IUserRepository2, IUser2>
{
    public ChildClass()
    {
       IUserRepository2 userRepos = GetRepository();
       IUser2 user = GetInstance();

    }
}

答案 1 :(得分:0)

尝试一下这个:

  public abstract class BaseClass<TEntity> where TEntity : class {
        public abstract <TEntity> Get<TEntity>();
  }

如果这对您没有帮助,请更具体。