Это очень возможно, но вам нужно либо не использовать общий интерфейс, либо делать много кастингов. Использование интерфейса...
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 во время выполнения. В этом нет ничего плохого, но, по моему опыту, довольно редко у вас будет несколько реализаций репозитория, поэтому в этом мало смысла.
person
Jamie Ide
schedule
08.07.2009