我创建了一个插件,它检查查询字符串中的参数并根据此 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));
}
}
}
我需要在我的服务中提供此用户对象,但我不想每次都检查 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; }
}