Я пытаюсь изменить существующее приложение 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 ищет конструктор вместо того, чтобы собирать публичную собственность?
Это устраняет исключение, но создает все регистраторы с именем «global», которое не полезно для ведения журнала. Это ставит меня в ту же ситуацию, что и этот связанный вопрос (http://stackoverflow.com/questions/28443955/how-to-inject-nlog-using-autofac-in-asp-net-webforms). Я пробовал этот подход в ответе на этот вопрос, но это привело меня к исключению в этом вопросе. – jovball
Я не уверен, чего вы пытаетесь достичь здесь ... Вы хотите каким-то образом установить класс журнала при его разрешении? – tdragon
Выполнение этого без DI будет выглядеть следующим образом. 'public partial class MyTestPage: Страница { protected static readonly ILogger Logger = LogManager.GetCurrentClassLogger();' Когда журнал регистрирует что-то, имя регистратора будет «MyTestPage.«Поэтому мне нужно ввести его, но GetCurrentClassLogger() выполняется в контексте веб-страницы, а не в контексте global.asax.cs. – jovball