gpt4 book ai didi

c# - 如何配置 Autofac 以解析 CQRS 处理程序并在 Web API 项目中编写其查询调度程序

转载 作者:行者123 更新时间:2023-11-30 16:01:04 24 4
gpt4 key购买 nike

我在 Project1 的 QUERY 端有以下内容,主要包含接口(interface)

public interface IQueryResult {}
public interface IQuery<TResult> where TResult : IQueryResult {}
public interface IQueryHandler<TQuery, TResult>
where TQuery : IQuery<TResult>
where TResult : IQueryResult
{
Task<TResult> HandleAsync(TQuery query);
}

public class PersonQueryResult : IQueryResult
{
public string Name { get; set; }
}
public class GetPersonDetailsQuery : IQuery<PersonQueryResult>
{
public int Id { get; set; }
}
public interface IQueryDispatcher
{
Task<TResult> DispatchAsync<TQuery, TResult>(TQuery query)
where TQuery : IQuery<TResult>
where TResult : IQueryResult;
}

在引用项目 1 的第二个项目 2 中,我有

public class GetPersonDetailsQueryHandler : 
IQueryHandler<GetPersonDetailsQuery, PersonQueryResult>
{
public Task<PersonQueryResult> HandleAsync(GetPersonDetailsQuery query)
{
return Task.FromResult( new PersonQueryResult {Name = "Bamboo"});
}
}

最后一个项目 3 是一个 Web API 项目,它只引用项目 1 而不是项目 2。因此它只知道接口(interface)、命令和查询。 我需要以一种我可以轻松执行此类操作的方式配置 autofac

var query = new GetPersonDetailsQuery { Id = 1 };
var magicHappensHere = new QueryDispatcher(); //any better way?
PersonQueryResult result = magicHappensHere.Dispatch(query);

此外,我在项目 1 中使用的 IQueryDispatcher 似乎不适合上述工作。该接口(interface)的一个示例实现是开放的建议是

public class QueryDispatcher : IQueryDispatcher
{
private readonly IComponentContext _context;

public QueryDispatcher(IComponentContext context)
{
this._context = context;
}

public Task<TResult> DispatchAsync<TQuery, TResult>(TQuery query) where TQuery : IQuery<TResult> where TResult : IQueryResult
{
var handler = _context.Resolve<IQueryHandler<TQuery, TResult>>();

return handler.HandleAsync(query);
}
}

我不知道如何实现的可能解决方案(A) 在项目 2 中定义一个 Autofac 模块,然后在 Web API 中扫描项目 2 程序集?..(乙) http://docs.autofac.org/en/latest/register/registration.html#open-generic-components(C) 扫描程序集并尝试自动映射。需要有关在此处插入代码的帮助

private static void ConfigureAutofac(HttpConfiguration config) 
{
var builder = new ContainerBuilder();
//*************//
//what to do here?
//**************//
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.RegisterWebApiFilterProvider(config);

var container = builder.Build();
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
}

最佳答案

最终得到建议的解决方案(B)http://docs.autofac.org/en/latest/register/registration.html#open-generic-components上类。此外,我可以确认没有将对 dll 的引用添加到解决方案中

但是,我仍然需要一种从 API 项目分派(dispatch)查询的好方法。更直观的东西

private static void ConfigureAutofac(HttpConfiguration config) 
{
var builder = new ContainerBuilder();
//*************//
//heres what i did
//*************//
var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>();

foreach (var assembly in assemblies)
{
builder.RegisterAssemblyTypes(assembly).AssignableTo<IQueryResult>().AsImplementedInterfaces();

builder.RegisterAssemblyTypes(assembly).AsClosedTypesOf(typeof(IQuery<>)).AsImplementedInterfaces();

builder.RegisterAssemblyTypes(assembly).AsClosedTypesOf(typeof(IQueryHandler<,>)).AsImplementedInterfaces();

}
//rest of the code
}

关于c# - 如何配置 Autofac 以解析 CQRS 处理程序并在 Web API 项目中编写其查询调度程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39121851/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com