我创建了一个插件,它检查查询字符串中的参数并根据此 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; }
}