我对CQRS模式还很陌生,并且在将所有这些与我选择的依赖项注入容器绑定在一起时遇到了问题。>
我拥有的是一个通用查询对象
public interface IQuery<TResult> { }
由GenericQuery实现
public class GenericQuery<TSrcEntity> : IQuery<IEnumerable<TSrcEntity>> { public Expression<Func<TSrcEntity, bool>> Filter { get; set; } public Func<IQueryable<TSrcEntity>, IOrderedQueryable<TSrcEntity>> OrderBy { get; set; } public IEnumerable<string> IncludeProperties { get; set; } }
然后,我通过查询分派器来处理所有这一切,该查询分派器确定要通过依赖关系解析器使用哪个处理程序
public class QueryDispatcher:IQueryDispatcher { public TResult Dispatch<TQuery, TResult>(TQuery query) where TQuery : IQuery<TResult> { var handler = DependencyResolver.Get<IQueryHandler<TQuery,TResult>>(); return handler.Retreive(query); } }
处理程序实现
public class GenericQueryHandler<TSrcEntity> : IQueryHandler<GenericQuery<TSrcEntity>, IEnumerable<TSrcEntity>> where TSrcEntity : class { public IEnumerable<TSrcEntity> Retreive(GenericQuery<TSrcEntity> query) { return GetDocuments(); }
我的LightInject注册看起来像这样
class Program { static void Main(string[] args) { var container = new ServiceContainer(); //service container.Register<ITestService, TestService>(); //query container.Register(typeof(IQuery<>), typeof(GenericQuery<>)); //handler This one works, but I dont want to register everything explicity. container.Register(typeof(IQueryHandler<GenericQuery<Document>, IEnumerable<Document>>), typeof(GenericQueryHandler<Document>)); //dispatcher container.Register<IQueryDispatcher, QueryDispatcher>(); DependencyResolver.SetResolver(container); var service = container.GetInstance<ITestService>(); var a = service.GetDocuments(); }
只要我显式注册我的处理程序,一切都会顺利,如此处所示>>
//handler This one works, but I dont want to register everything explicity. container.Register(typeof(IQueryHandler<GenericQuery<Document>, IEnumerable<Document>>), typeof(GenericQueryHandler<Document>));
但是我不想为每个实体都这样做。较熟悉LightInject的人可以提供帮助吗?
可以在Generic Query Problem找到示例程序
感谢
我对CQRS模式还很陌生,在将所有这些与我选择的依赖项注入容器绑定在一起时遇到问题。(LightInject)我拥有的是通用查询对象public ...
我知道这是一篇旧文章,但是我遇到了同样的问题,并且找到了解决方案。我在这里找到了解决方案:https://github.com/seesharper/LightInject/issues/350
该页面上的代码是这样: