Так у меня есть такой архитектуры программы (LibraryManager):Unity IoC с ОС Windows Froms
Data Access Layer имеет класс, который должен управлять данными и общаться с ведущим
public interface ILibraryDataManager
{
//some code...
}
public class LibraryDataManager:ILibraryDataManager
{
//some code...
}
Реализация примитива , не останавливаться на внимании ... Далее, в главном проекте реализующего класса: MessageService - чтобы иметь возможность отображать сообщения в любом месте программы
interface IMessageService
{
//some code
}
class MessageService : IMessageService
{
//some code
}
LoginService и MainService - вход логики реализации и основные функции приложения
public interface ILoginService
{
//some code
}
class LoginService : ILoginService
{
private readonly IMessageService messageServise;
private readonly ILibraryDataManager libraryDBManger;
public LoginService(IMessageService messageServise, ILibraryDataManager libraryDataManager)
{
this.messageServise = messageServise;
this.libraryDBManger = libraryDataManager;
}
//some code...
}
public interface IMainService
{
//some code
}
class MainService : IMainService
{
private readonly IMessageService messageService;
private readonly ILibraryDataManager libraryDBManger;
public MainService(ILibraryDataManager libraryDataManager, IMessageService messageService)
{
this.libraryDBManger = libraryDataManager;
this.messageService = messageService;
}
//some code...
}
Далее, соответственно интерфейс IView и его производные интерфейсы и классы, которые реализуют их:
public interface IView
{
//some code...
}
public interface ILoginView: IView
{
//some code...
}
public partial class FormLogin : Form, ILoginView
{
//some code...
}
public interface IMainView: IView
{
//some code...
}
public partial class MainForm : Form, IMainView
{
//some code...
}
Теперь мы понимаем ссылку элемент - ведущие:
public interface IPresenter
{
void Run(); // этот метод должен запускать соответствующую форму (IView), переданную презентеру в конструкторе
}
class LoginPresenter : IPresenter
{
private readonly ILoginView loginView;
private readonly ILoginService loginService;
private readonly IMessageService messageService;
public LoginPresenter(ILoginView loginView, ILoginService loginService, IMessageService messageService)
{
this.loginView = loginView;
this.loginService = loginService;
this.messageService = messageService;
}
public void Run()
{
loginView.Show();
}
//some code...
}
class MainPresenter : IPresenter
{
private readonly IMainView mainView;
private readonly IMessageService messageService;
private readonly IMainService mainService;
public MainPresenter (IMainView mainView, IMessageService messageService, IMainService mainService)
{
this.mainService = mainService;
this.mainView = mainView;
this.messageService = messageService;
}
public void Run()
{
Application.Run(mainView as Form);
}
А теперь это все, что мне нужно зарегистрировать в c ontainer и попробуйте запустить приложение:
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
UnityContainer container = new UnityContainer();
container.RegisterType<ILibraryDataManager, LibraryDataManager>()
.RegisterType<IMessageService, MessageService>()
.RegisterType<ILoginService, LoginService>()
.RegisterType<ILoginView, FormLogin>()
.RegisterType<IMainView, MainForm>();
var obj = container.Resolve<MainPresenter>();
obj.Run();
}
}
Однако линия obj.Run()
не доходит до исполнения, как и во время предыдущего ряда
var obj = container.Resolve<MainPresenter>();
летит исключение с таким содержанием:
Microsoft .Practices.Unity.ResolutionFailedException не было обработано HResult = -2146233088 Сообщение = Разрешение неудачи, тип = "Libr ary.MainPresenter ", name =" (none) ". Исключение произошло во время: при разрешении. Исключение: InvalidOperationException. Текущий тип , Library.IMainService, является интерфейсом и не может быть сконструирован. Вам не хватает типов картографирования? ----------------------------------------------- На время, за исключением, контейнер был:
Решение Library.MainPresenter, (нет) Разрешающая параметр "mainService" из конструктора Library.MainPresenter (Library.IMainView MainView, Library.IMessageService MessageService, Library.IMainService mainService) Разрешающая Library.IMainService, (нет)
Как я понимаю, на основе описания ошибки во время создания MainPresenter и передать его UnityContainer параметры в попытке создать объект интерфейса, который, конечно, невозможно. Но я добавил к этому вопросу «Интерфейс - класс» в контейнере и возьму его, Unity должен создать соответствующий объект, а затем передать ему ссылку на интерфейс, а результат совсем другой.
Извините за мой неуклюжий английский язык: \
О, да грубо! Я сделал банальную ошибку ... – Faltfromoss