Моя компания разделяемая библиотека, которая имеет такой кодКастинг реализации на интерфейс с общим типом
public interface IBaseService<TBaseUser> where TBaseUser : BaseUser
{
// snip
}
public class User : BaseUser
{
// snip
}
public class SomeService : IBaseService<User>
{
}
Различные приложения используют этот общий код. Я пытаюсь написать базовый контроллер, который принимает IBaseService<BaseUser>
в своем ctor.
public class BaseController : Controller
{
public BaseController(IBaseService<BaseUser> service)
{
}
}
код на уровне библиотеки работает точно так, как я ожидал, но когда я пытаюсь использовать его из потребляющего приложения и передавать в производном типе, т.е. Service
типа, она не сможет с некорректным гипсом ,
public class MyController : BaseController
{
public MyController(SomeService service) : base(service)
{
}
}
Является ли это тем, что я хочу сделать возможным?
Похоже, ваш интерфейс должен быть ковариантным ... 'IBaseService'. Это не скомпилируется, если какой-либо из методов использует 'TBaseUser' как входную позицию, конечно ... –
@JonSkeet Спасибо - я пренебрег упоминанием ковариации - я не могу сделать это ковариантным, поскольку интерфейс использует TBaseUser для возврата & входные значения. – Sam
В этом случае SomeService просто не реализует 'IBaseService' –