通用类型约束构造函数限制,需要建议

时间:2015-12-27 21:10:20

标签: c# .net generics asp.net-web-api2

我正在尝试根据传递的类型参数来实例化类的构造函数中的对象,以创建所述类的实例。

public class DefaultController<TEntity, TStrategy> : ApiController, IDisposable where TEntity : class, IEntity where TStrategy: BaseStrategy<TEntity>
{

    public IStrategy<TEntity> strategy { get; set; }


    public DefaultController()
    {
        //strategy = ??
    }
}

这里是BaseStrategy

public abstract class BaseStrategy<TEntity> : IStrategy<TEntity> where TEntity : class, IEntity
{

    private IRepository<TEntity> repository;

    public BaseStrategy(IRepository<TEntity> _repository)
    {
        repository = _repository;
    }

    //implements a bunch of methods...
}

如您所见,BaseStategy没有无参数构造函数,因此无法在new()中使用DefaultController通用约束

我想要实现的是,从扩展DefaultController的类中,配置使用哪种策略

public class UserController : DefaultController<User, GreatStrategy<User>>
{
    //   GreatStrategy extends BaseStrategy
}

任何使用魔术或其他方法的解决方法可能吗?

感谢。

2 个答案:

答案 0 :(得分:1)

DefaultController是否需要无参数构造函数?你可以尝试:

public DefaultController(IStrategy<IEntity> strategy) : base(strategy)
{
    // Do stuff
}

然后在你的UserController构造函数中:

public UserController() : base(new GreatStrategy<User>()) {
    // Do stuff
}

您是否在应用程序中使用IoC?如果是这样,您可以注册策略并将它们注入控制器构造函数中,这样您就不必在基础构造函数调用中启动新策略。

希望这能为你提供一些指导。

答案 1 :(得分:0)

我最终修改了默认控制器的构造函数以及所有控制器的构造函数:

    public DefaultController(IStrategy<TEntity> _strategy)
    {
        strategy = _strategy; // 'strategy' is a local member implementing IStrategy...
    }

扩展默认控制器的控制器有一个构造函数,如:

public class UserController : DefaultController<User>
{
    public UserController()
        : base (new GreatStrategy<User>(new Repository<User>()))
    {
        //GreatStrategy extends BaseStrategy...
    }

}