2015-05-22 2 views
3

Так у меня есть такой архитектуры программы (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 должен создать соответствующий объект, а затем передать ему ссылку на интерфейс, а результат совсем другой.

Извините за мой неуклюжий английский язык: \

ответ

1

Две проблемы.

Вы пропускаете регистрацию `IMainService» к „MainService“, такие как:

container.RegisterType<ILibraryDataManager, LibraryDataManager>() 
     .RegisterType<IMainService, MainService>() 

и ваш MainService класс не объявлен общественности.

+0

О, да грубо! Я сделал банальную ошибку ... – Faltfromoss

Смежные вопросы