Мои решения имеют несколько проектов, которые включают в себя несколько библиотек и один проект для пользовательского интерфейса. В настоящее время это приложение Windows Forms, и я использую log4net для регистрации. Этот проект пользовательского интерфейса имеет только ссылку на log4net, и этот проект поддерживает файлы конфигурации. Но я также хотел бы войти из моих библиотек.
Обычный способ сделать это - обернуть вызовы регистрации за интерфейсом. Создайте общий проект, который называется утилиты, и добавьте этот интерфейс в этот проект. Теперь этот проект может использоваться во всех проектах и может использовать этот интерфейс для регистрации.
Я думаю об альтернативном дизайне, который включает в себя передачу делегатов и уменьшение связи и избегание ненужных интерфейсов.
Рассмотрим следующий класс из моей библиотеки.
public sealed class Foo
{
Action<string> log;
Action<string, Exception> logException;
public Foo(Action<string> log, Action<string,Exception> logException)
{
this.log = log;
this.logException = logException;
}
public void Work()
{
WL("Starting work");
WL("Completed step1");
.........
}
void WL(string message)
{
if(log != null) log(message);
}
void WL(string message, Exception exception)
{
if(logException != null) logException(message, exception);
}
}
Теперь из вызывающего кода я могу легко передать метод регистрации. Что-то вроде
Foo foo = new Foo(message => Console.WriteLine(message),
(message, exception) => Console.WriteLine("{0},{1}", message, exception));
foo.Work();
Использовал консоль для объяснения, на самом деле я буду использовать здесь код регистрации.
1 - Вы считаете это лучшим решением? Я думаю, что это лучше, так как это более слабо связано.
2 - Существуют ли другие лучшие решения?
Этот является единственным связанным вопросом, который я нашел здесь
Есть мысли ...?