Я использую StructureMap во многих кодах, которые я генерирую, и у меня есть реестр StructureMap, который я использую, чтобы подключить регистратор к контексту класса, в который он внедряется.
Для справки, я 'm использует версию StructureMap версии 2.6.2, но должно работать с 2.5+, если используется новый формат .For <> (). Use <> ().
public class CommonsRegistry : Registry
{
public CommonsRegistry()
{
For<ILogger>().AlwaysUnique().Use(s => s.ParentType == null ? new Log4NetLogger(s.BuildStack.Current.ConcreteType) : new Log4NetLogger(s.ParentType.UnderlyingSystemType.Name));
XmlConfigurator.ConfigureAndWatch(new FileInfo(Path.Combine(Path.GetDirectoryName(Assembly.GetAssembly(GetType()).Location), "Log.config")));
}
}
Что делает этот реестргде бы ни вводился ILogger, используйте класс, в который он внедряется, где сообщения регистрации регистрируются в / context of.
* Кроме того, во второй строке (XmlConfigurator.ConfigureAndWatch) я сообщаю Log4Net:получить информацию журнала из файла "Log.config" вместо файла конфигурации приложения, вам это может понравиться или не понравиться, и его можно опустить.
Код, который я использую, представляет собой обычную процедуру IOC.Startup, в которой япрошло бы, если бы я хотел использовать регистр по умолчанию.
ObjectFactory.Initialize(x =>
{
x.AddRegistry<CommonsRegistry>();
...
}
Это дает мне имя вызывающего класса в экземпляре регистрации, где сообщения регистрируются в autи все, что требуется, это ввести логгер в класс.
class foo
{
private readonly ILogger _log;
public foo(ILogger log)
{
_log = log;
}
}
Теперь сообщения регистрируются как контекст / класс "foo".