Это большой вопрос.
Самый простой способ - добавить ссылку на System.Windows.Forms в свой класс lib.Затем передайте окно в качестве аргумента вашему бизнес-классу.Но хотя это простое решение, оно не является чистым способом.В чистой многоуровневой архитектуре нельзя использовать объекты верхних уровней в нижних слоях.Это может быть как проблемой для компиляции, так и черной дырой обслуживания.Более того, модульное тестирование в таких случаях является сложным.
Учитывая это, еще одним решением, более сложным, было бы использование инверсии управления, использование инфраструктуры, такой как Unity, Mef или любой другой, или даже выполнение вручную.
Основная идея состоит в том, чтобы создать в вашей библиотеке классов интерфейс, который определяет взаимодействие с пользователем, например, так:
public interface IInputValidator {
bool IsValid(MyClass itemToValidate);
}
Затем в приложении Windows Form реализуйте этот интерфейс:
public class Form1 : Form, IInputValidator {
public void CallBusinessClass() {
var myObj = new BusinessClass(this); // the key of the concept is here
myObj.Iterate();
}
public bool IsValid(MyClass itemToValidate) {
return MessageBox.Show("Is valid ?", MessageBoxButtons.YesNo) == MessageBoxButtons.Yes);
}
}
Тогда в вашем бизнес-классе:
public class BusinessClass {
private IInputValidator m_validator;
public BusinessClass(IInputValidator validator) {
this.m_validator = validator;
}
public void Iterate()
{
foreach(var item in ItemsToIterate)
{
var isValid = m_validator.IsValid(item); // call the upper layer from a lower layer
}
}
}
Надеюсь, что поможет