1

Этот вопрос относится к моим другим 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); 
    } 
} 

ответ

1

Это очень плохо, что вы делаете здесь. У вас должен быть один экземпляр контейнера для каждого приложения, тогда как с этим кодом у вас будет по одному на каждый запрос.

+0

Hi. Спасибо за ваш ответ. Это имеет смысл (это то, что, как я думал, было бы так, я думал, что было бы лучше создать контейнер где-нибудь еще, то есть Application_Start (Global.asax.cs), но даже если я создам статический сервисный локатор, как предлагает Маурицио ниже, как делает для регулирования доступа HttpHandler контейнер? – Matt

1

Об ошибке в NUnit: убедитесь, что у вас нет других версий замковых сборок в GAC. Если это так, удалите их.

О вашем BaseHttpHandler: проблема с этой реализацией заключается в том, что вы создаете новый контейнер. Вместо этого используйте один контейнер для каждого приложения, как сказал Кшиштоф. Используйте статический сервисный локатор, например. CommonServiceLocator. (Я никогда не рекомендую это, но это одно из немногих мест, где это имеет смысл).

+0

Могу ли я не просто добавить контейнер к HttpApplicationState ?? защищен недействительным Application_Start (объект отправителя, EventArgs е) { Application.Add («контейнер», новый WindsorContainer (новый XmlInterpreter (новый ConfigResource («замок»)))) } – Matt

+0

@Matt: да, это тоже работает –

+0

Спасибо за ваши замечания. О проблеме с Castle.Core assembly, я проверил GAC, и на самом деле это не так? – Matt

Смежные вопросы