此問題與我的其他post有關。使用IoC容器作爲HttpHandler的服務定位器
好了,等一會兒有更多的混亂後,我決定這樣做。這似乎工作正常,當我運行它,雖然我在NUnit中收到以下錯誤:無法加載文件或程序集'Castle.Core,Version = 1.0.3.0,Culture = neutral,PublicKeyToken = 407dd0808d44fbdc'或其中一個依賴。定位的程序集清單定義與程序集引用不匹配。 (從HRESULT異常:0x80131040)所以不知道那裏發生了什麼?
只是想知道別人對設計的看法,以及是否有任何明顯的「不」或改進。即基礎處理程序的構造函數是實例化windsor組件的好地方,還是有更好的地方可以做到這一點?正如我在原始文章中所說的那樣,通過這種方式做事背後的想法是保持組件良好地分離並使單元測試變得容易。我還應該補充我是單元測試新手,嘲笑。謝謝!
public abstract class BaseHttpHandler : IHttpHandler
{
private HttpContext _httpContext;
private ILogger _logger;
private IDataRepository _dataRepository;
protected HttpRequest Request { get { return _httpContext.Request; } }
protected HttpResponse Response { get { return _httpContext.Response; } }
protected bool IsRequestFromUAD { get { return Request.UserAgent == null ? false : Request.UserAgent.Equals("UAD"); } }
protected ILogger Logger { get { return _logger; } }
protected IDataRepository DataRepository { get { return _dataRepository; } }
public virtual bool IsReusable { get { return false; } }
public BaseHttpHandler()
{
var container = new WindsorContainer(new XmlInterpreter(new ConfigResource("castle")));
_logger = container.Resolve<ILogger>();
_dataRepository = container.Resolve<IDataRepository>();
}
public void ProcessRequest(HttpContext context)
{
_httpContext = context;
ProcessRequest(new HttpContextWrapper(context));
}
public abstract void ProcessRequest(HttpContextBase context);
}
public class UADRecordHttpHandler : BaseHttpHandler
{
public override void ProcessRequest(HttpContextBase context)
{
if (IsRequestFromUAD)
{
using (var reader = new StreamReader(context.Request.InputStream))
{
string data = reader.ReadToEnd();
if (Logger != null)
Logger.Log(data);
if(DataRepository != null)
DataRepository.Write(data);
context.Response.Write(data);
}
}
else
ReturnResponse(HttpStatusCode.BadRequest);
}
}
嗨。感謝您的答覆。這是有道理的,(這是我認爲是這種情況,我認爲最好在其他地方創建容器,比如Application_Start(Global.asax.cs),但即使我創建了一個靜態服務定位器,就像Mauricio建議的那樣下面是如何做的HttpHandler的接入容器? – Matt 2010-08-23 23:46:44