Базовый репозиторий Autofac, где T не является классом - PullRequest
0 голосов
/ 02 июля 2019

Я столкнулся с проблемой при попытке разрешить мои общие репозитории для доступа к базе данных. Когда я использую эти два в качестве реализации / интерфейса репозитория, я не могу решить, например, IRepository<ICustomer>:

Интерфейс:

public interface IRepository<T> where T : IDbModel
{ ... }

Реализация:

public class Repository<T> : IRepository<T> where T : DbModel
{ ... }

Но когда я заменяю IDbModel и DbModel на class, в обоих случаях это работает как ожидалось.

Моя регистрация выглядит так:

builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>));
builder.RegisterType<DbModel>().As<IDbModel>();
builder.RegisterType<Customer>().As<ICustomer>();

Для полноты, вот ICustomer:

public interface ICustomer : IDbModel
{ ... }

Customer:

public class Customer : DbModel, ICustomer
{ ... }

IDbModel:

public interface IDbModel
{ ... }

И DbModel (я проверял, работает ли я при удалении abstract, но это не так):

public abstract class DbModel : IDbModel
{ ... }

Мне было интересно, возможно ли сделать мою первую попытку как-нибудь сработавшей?

1 Ответ

1 голос
/ 02 июля 2019

При запросе Autofac разрешить IRepository<ICustomer> он попытается разрешить Repository<ICustomer>, а ICustomer не DbModel

Чтобы исправить ошибку, вы должны заменить ограничение типа класса на IRepository<TModel> на ограничение типа интерфейса.

 public class Repository<T> : IRepository<T> 
    where T : IDbModel 
 { }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...