我已經創建了一個插件,用於檢查查詢字符串中的參數,並根據此ID加載用戶對象,並使用它填充任何請求DTO的 。 (從BaseRequest我的所有要求DTO的繼承具有CurrentUser屬性)是否有可能在運行時注入一個對象實例到服務
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; }
}
這是我的同事提出的解決方案,我們不想在我們的服務中使用http請求上下文特定的功能,因爲我們直接調用我們的測試,而無需通過http堆棧。感謝所有回覆 – Martin 2013-03-21 16:37:46