Как зарегистрировать универсальный UnitOfWork <TContext>с неуниверсальным IUnitOfWork в Касл Виндзор? - PullRequest
0 голосов
/ 31 октября 2019

Это мой код:

public interface IUnitOfWork : IDisposable
{
    IRepository<TEntity> GetRepository<TEntity>() where TEntity : class;

    void Save();
}




  public class UnitOfWork<TContext> : IUnitOfWork where TContext : IDbContext, new()
  {
    private readonly IDbContext _ctx;
    private readonly Dictionary<Type, object> _repositories;
    private bool _disposed;
...................

EmployeeService.cs

public class EmployeeService : EntityService<Employee>, IEmployeeService
{
    readonly IUnitOfWork _unitOfWork;
    readonly IRepository<Employee> _repository;
........

в консольном приложении, когда я звоню:

var employeeService = Injector.Instance.Resolve<IEmployeeService>();

Я получаю ошибку нижесообщение:

Необработанное исключение типа 'Castle.MicroKernel.Handlers.GenericHandlerTypeMismatchException' произошло в Castle.Windsor.dll Дополнительная информация: Типы EfContext.DAL.IDbContext не удовлетворяют общим ограничениям типа реализации EfContext.DAL.UnitOfWork 1 of component 'EfContext.DAL.UnitOfWork 1 '. Вероятно, это ошибка в используемой IGenericImplementationMatchingStrategy (EfContext.DependencyInjection.UseStringGenericStrategy)

public class ConsoleAppInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore store)
    {


        container.Register(Component.For(typeof(IUnitOfWork)).ImplementedBy(typeof(UnitOfWork<>), new UseStringGenericStrategy()).LifestyleTransient());

    }
}

    public class UseStringGenericStrategy : IGenericImplementationMatchingStrategy
    {
        public Type[] GetGenericArguments(ComponentModel model, CreationContext context)
        {
            if (context.RequestedType == typeof(IUnitOfWork))
            {
                var res = new[] { typeof(object) };
                return res;
            }
            return null;
        }
    }

1 Ответ

1 голос
/ 01 ноября 2019

Я исправил проблему с изменением строки регистра на:

// register
container.Register(Component.For(typeof(IUnitOfWork)).ImplementedBy(typeof(UnitOfWork<MyDbContext>),
    new UseTypeGenericStrategy()).LifestyleTransient());
...