首页 > 解决方案 > Castle Windsor Register:无法创建组件“X.YService”,因为它需要满足依赖项

问题描述

这应该是一个普遍的问题,我已经搜索但找不到任何解决方案,如果它是一个骗子,请指出适当的链接。所以,我有一个通用存储库来支持几个实体,有一会儿我像下面这样注册它

控制器:这是我的控制器部分

        public class XController : Controller
            {

                private  ILegendsService _legendsService;
                public LegendsController(ILegendsService legendsService)
                {
                    _legendsService = legendsService;
                }
        } 

服务:这是我的传奇服务科

         public class LegendsService:ILegendsService
            {
                private readonly IRepositoryFactory<Legends, int> _legends;
                private readonly IUnitOfWork _unitOfWork;
                private readonly IDiObjectMapper _mapper;
                public LegendsService(IRepositoryFactory<Legends, int> 
                    legendsInfo
                    , IUnitOfWork unitOfWork
                    , IDiObjectMapper mapper)
                {
                    _legends = legendsInfo;
                    _unitOfWork = unitOfWork;
                    _mapper = mapper;


                }
        }

RepositoryFactory:这是存储库工厂

    public interface IRepositoryFactory<TEntity, in TKey> : 
      IRepository<TEntity, TKey> where TEntity : class
         {
         }

        public class RepositoryFactory<TEntity, TKey> : Repository<TEntity, 
        TKey>, IRepositoryFactory<TEntity, TKey> where TEntity : class
        {
            public RepositoryFactory(IDatabaseFactory databaseFactory)
                : base(databaseFactory)
            {
            }
        }

UnitOfWork:这是我的 unitofWorkSection

    public interface IUnitOfWork : IDisposable
    {
        void Commit();
        Task CommitAsync();
    }

    public class UnitOfWork : IUnitOfWork
    {
        private readonly IDatabaseFactory _databaseFactory;
        private bool _disposed = false;
        private KYCContext _dataContext;

        public UnitOfWork(IDatabaseFactory databaseFactory)
        {
            this._databaseFactory = databaseFactory;
        }

        protected KYCContext DataContext => _dataContext ?? (_dataContext = _databaseFactory.Get());
}

DIObjectMapper:这是我的 DIObjectMapper

 public interface IDiObjectMapper
    {
        TDestination Map<TSource, TDestination>(TSource source)
            where TSource : class
            where TDestination : class;

        TDestination Map<TSource, TDestination>(TSource source, TDestination destination)
            where TSource : class
            where TDestination : class;
    }

    public class DiObjectMapper : IDiObjectMapper
    {
        public TDestination Map<TSource, TDestination>(TSource source)
            where TSource : class
            where TDestination : class
        {
            return AutoMapperSetup.Mapper.Map<TSource, TDestination>(source);
        }

        public TDestination Map<TSource, TDestination>(TSource source, TDestination destination)
            where TSource : class
            where TDestination : class
        {
            return AutoMapperSetup.Mapper.Map(source, destination);
        }
    }

温莎城堡:这是温莎城堡集装箱登记区

   container.Register(Component.For<IDisposable> 
    ().ImplementedBy<IDatabaseFactory>().LifestylePerWebRequest());
     container.Register(Component.For<IRepository<Legends, int>> 
   ().ImplementedBy<Repository<Legends, int>> 
   ().LifestylePerWebRequest());
    container.Register(Component.For<ILegendsService> 
   ().ImplementedBy<LegendsService>().LifestylePerWebRequest());
        container.Register(Component.For<IDatabaseFactory> 
   ().ImplementedBy<DatabaseFactory>().LifestylePerWebRequest());
        container.Register(Component.For<IUnitOfWork> 
   ().ImplementedBy<UnitOfWork>().LifestylePerWebRequest());
        container.Register(Component.For<IRepositoryFactory<Legends, int>> 
    ().ImplementedBy<RepositoryFactory<Legends, int>> 
    ().LifestylePerWebRequest());
        container.Register(Component.For<IDiObjectMapper> 
    ().ImplementedBy<DiObjectMapper>().LifestylePerWebRequest());
        container.Register(Component.For<IDisposable> 
    ().ImplementedBy<Disposable>().LifestylePerWebRequest());
        container.Register(Component.For<IRepository<Legends, int>> 
     ().ImplementedBy<IRepositoryFactory<Legends, int>> 
     ().LifestylePerWebRequest());

注意:我没有提到 Repository 和 IRepository 它们实际上只包含相同的通用 CRUD 操作

标签: asp.net-mvc-4c#-4.0repositoryentity-framework-5castle-windsor

解决方案


这解决了我的问题:

         container.Register(Component
           .For(typeof(IRepositoryFactory<,>))
           .ImplementedBy(typeof(RepositoryFactory<,>))
           .LifestylePerWebRequest());
         container.Register(Component
           .For(typeof(IRepository<,>))
           .ImplementedBy(typeof(Repository<,>))
           .LifestylePerWebRequest());

推荐阅读