Этот вопрос относится к моим другим post.Использование контейнера IoC в качестве сервисного локатора для HttpHandler
Итак, после немного более беспорядочного решения я решил сделать это таким образом. Кажется, что он работает нормально, когда я запускаю его, хотя в NUnit появляется следующая ошибка: не удалось загрузить файл или сборку «Castle.Core, Version = 1.0.3.0, Culture = neutral, PublicKeyToken = 407dd0808d44fbdc» или один из ее зависимостей. Определение манифеста размещенной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040) Так что не уверен, что там происходит?
Просто хотел знать, что другие подумали о дизайне, и есть ли какие-либо очевидные «нет» или улучшения. То есть Является ли конструктором базового обработчика хорошим местом для создания экземпляра компонента виндзора или есть ли лучшее место для этого? Как я уже говорил в оригинальном посте, идея делать то, что делала так, заключалась в том, чтобы сохранить компоненты красиво отделенными и сделать модульное тестирование легким. Я также должен добавить, что я новичок в модульном тестировании, насмешливо. Благодаря!
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);
}
}
Hi. Спасибо за ваш ответ. Это имеет смысл (это то, что, как я думал, было бы так, я думал, что было бы лучше создать контейнер где-нибудь еще, то есть Application_Start (Global.asax.cs), но даже если я создам статический сервисный локатор, как предлагает Маурицио ниже, как делает для регулирования доступа HttpHandler контейнер? – Matt