我正在尝试根据传递的类型参数来实例化类的构造函数中的对象,以创建所述类的实例。
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
}
任何使用魔术或其他方法的解决方法可能吗?
感谢。
答案 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...
}
}