Это очень возможно, но вы либо не должны использовать общий интерфейс, либо выполнять много кастинга. Использование интерфейса ...
public interface IRepository
{
public object Get(int id); // or object id
public void Save(object obj);
}
public class CustomerRepository : IRepository
{
public object Get(int id) { // implementation }
public void Save(object obj) { // implementation }
}
Это работает нормально, но вызывающий код должен приводить объекты к правильному типу, а методы в конкретных реализациях должны проверять тип и генерировать исключения. Прямое приведение требует исключений во время выполнения, поэтому я бы избегал такого подхода.
Подход, который я бы порекомендовал, заключается в том, чтобы в ваших хранилищах не было общего интерфейса. Вместо этого пусть они реализуют общеизвестные методы по соглашению.
public class CustomerRepository
{
public Customer Get(int id) { // implementation }
public void Save(Customer entity) { // implementation }
}
public class EmployeeRepository
{
public Employee Get(int id) { // implementation }
public void Save(Employee entity) { // implementation }
}
Отредактировано, чтобы добавить: я перечитала связанный ответ. Последний полный абзац теряет меня, но я могу немного расширить использование DI. В большинстве случаев не имеет смысла использовать DI для внедрения «общего» (в данном случае значения, полученного из общего интерфейса) хранилища. В дополнение к обычным методам, хранилище будет иметь методы, специфичные для сущностей, например GetCustomersWithPastDueAccounts
. Вы можете определить ICustomerRepository с помощью этого метода и сделать так, чтобы ваш CustomerRepository реализовал это. Затем вы можете использовать внедрение зависимостей для внедрения CustomerRepository во время выполнения. В этом нет ничего плохого, но, по моему опыту, достаточно редко, чтобы у вас было несколько реализаций репозитория, поэтому в этом нет особого смысла.