2016-03-15 3 views
0

Я пытаюсь изменить существующее приложение WebForms и хотел бы использовать Autofac. Насколько я могу судить, я установил приложение в соответствии с документацией (http://autofac.readthedocs.org/en/latest/integration/webforms.html#structuring-pages-and-user-controls-for-di).Autofac с открытым конструкторским кодом свойств WebForms

код веб-страницы с общественной собственностью

public partial class MyTestPage : Page 
{ 
    public ILogger Logger { get; set; } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     //page load code here 

web.config

<modules> 
<add name="ContainerDisposal" type="Autofac.Integration.Web.ContainerDisposalModule, Autofac.Integration.Web" preCondition="managedHandler" /> 
    <add name="PropertyInjection" type="Autofac.Integration.Web.Forms.PropertyInjectionModule, Autofac.Integration.Web" preCondition="managedHandler" /> 
</modules>   

Global.asax.cs

public class Global : HttpApplication, IContainerProviderAccessor 
{ 
     static IContainerProvider _containerProvider; 

     public IContainerProvider ContainerProvider 
     { 
      get { return _containerProvider; } 
     } 


    void Application_Start(object sender, EventArgs e) 
    { 
     var builder = new ContainerBuilder(); 
     builder.RegisterType<Logger>().As<ILogger>().InstancePerRequest(); 
     _containerProvider = new ContainerProvider(builder.Build()); 

    } 

Когда я пытаюсь загрузить страницу, Autofac выбрасывает это исключение.

Никаких конструкторов типа «NLog.Logger» можно найти с помощью поиска конструктора «Autofac.Core.Activators.Reflection.DefaultConstructorFinder».

Что мне здесь не хватает? Почему Autofac ищет конструктор вместо того, чтобы собирать публичную собственность?

ответ

1

Проблема заключается в том, что Autofac пытается создать экземпляр класса Logger, чтобы ввести его в MyTestPage. Он пытается использовать стандартный конструктор без параметров, который недоступен. Так что проблема не в вашей странице, а в регистрации вашего регистратора.

Я не знаком с NLog, но, согласно учебному пособию, вы можете использовать LogManager для создания экземпляров Logger, например.

Logger logger = LogManager.GetCurrentClassLogger(); 

или

Logger logger = LogManager.GetLogger("MyClassName"); 

Таким образом, вы должны изменить свою регистрацию на что-то вроде этого (не тестировался):

builder.Register(c => LogManager.GetCurrentClassLogger()).As<ILogger>().InstancePerRequest(); 

Как я уже говорил выше, я не знаком с NLog, но Я предполагаю, что класс NLog Logger реализует интерфейс ILogger.

EDIT:

This модуль должен обрабатывать то, что вы пытаетесь достичь.

+0

Это устраняет исключение, но создает все регистраторы с именем «global», которое не полезно для ведения журнала. Это ставит меня в ту же ситуацию, что и этот связанный вопрос (http://stackoverflow.com/questions/28443955/how-to-inject-nlog-using-autofac-in-asp-net-webforms). Я пробовал этот подход в ответе на этот вопрос, но это привело меня к исключению в этом вопросе. – jovball

+0

Я не уверен, чего вы пытаетесь достичь здесь ... Вы хотите каким-то образом установить класс журнала при его разрешении? – tdragon

+0

Выполнение этого без DI будет выглядеть следующим образом. 'public partial class MyTestPage: Страница { protected static readonly ILogger Logger = LogManager.GetCurrentClassLogger();' Когда журнал регистрирует что-то, имя регистратора будет «MyTestPage.«Поэтому мне нужно ввести его, но GetCurrentClassLogger() выполняется в контексте веб-страницы, а не в контексте global.asax.cs. – jovball

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