是否可以在运行时将对象实例注入到服务中

2024-01-07

我创建了一个插件,它检查查询字符串中的参数并根据此 ID 加载用户对象并填充 任何使用它的请求 DTO。 (我所有的请求 DTO 都继承自具有 CurrentUser 属性的 BaseRequest)

public class CurrentUserPlugin : IPlugin
{
    public IAppHost CurrentAppHost { get; set; }

    public void Register(IAppHost appHost)
    {
        CurrentAppHost = appHost;
        appHost.RequestFilters.Add(ProcessRequest);
    }

    public void ProcessRequest(IHttpRequest request, IHttpResponse response, object obj)
    {
        var requestDto = obj as BaseRequest;

        if (requestDto == null) return;

        if (request.QueryString["userid"] == null)
        {
            throw new ArgumentNullException("No userid provided");
        }

        var dataContext = CurrentAppHost.TryResolve<IDataContext>();
        requestDto.CurrentUser = dataContext.FindOne<User>(ObjectId.Parse(requestDto.uid));

        if (requestDto.CurrentUser == null)
        {
            throw new ArgumentNullException(string.Format("User [userid:{0}] not found", requestDto.uid));
        }
    }
}

我需要在我的服务中提供此 User 对象,但我不想每次都检查 DTO 并从那里提取。有没有办法使插件中的数据可供我的服务全局使用?我还想知道是否有另一种方法可以实例化该对象,对于我的单元测试,插件未运行 - 因为我直接调用我的服务。

所以,我的问题是,我可以在运行时将用户实例注入到我的服务中,而不是使用插件吗?我已经使用 IoC 来注入不同的数据库处理程序,具体取决于是否在测试模式下运行,但我不知道如何为需要在每个请求开始时实例化的 User 对象实现此目的。

下面是我如何在 appHost 中注入 DataContext 的示例。

container.Register(x => new MongoContext(x.Resolve<MongoDatabase>()));
container.RegisterAutoWiredAs<MongoContext, IDataContext>();

这是我的 BaseService 的示例。理想情况下,我希望我的服务也有一个 CurrentUser 属性。

public class BaseService : Service
{
    public BaseService(IDataContext dataContext, User user)
    {
        DataContext = dataContext;
        CurrentUser = user; // How can this be injected at runtime?
    }

    public IDataContext DataContext { get; private set; }
    public User CurrentUser { get; set; }
}

您是否考虑过尝试使用IHttpRequest 项目字典来存储对象。您可以从任何过滤器或服务或任何可以访问 IHttpRequest 的地方访问这些项目。请参阅 srcIHttp请求 https://github.com/ServiceStack/ServiceStack/blob/master/src/ServiceStack.Interfaces/ServiceHost/IHttpRequest.cs#L46.

只需注意属性、服务和插件的执行顺序以及将项目存储在项目字典中的时间即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以在运行时将对象实例注入到服务中 的相关文章

随机推荐