Unity IoC与Windows Forms

3
我有一个程序架构(LibraryManager):
数据访问层有一个类,负责管理数据并与Presenter通信。
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); 
    }

现在我只需要在容器中注册并尝试运行应用程序:

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 Message=解析依赖项失败,类型 = “Library.MainPresenter”,名称 = “(none)”。异常出现在:正在解析时。异常为:InvalidOperationException - 当前类型Library.IMainService是一个接口,无法构造。您是否缺少类型映射? ----------------------------------------------- 在异常发生时,容器为:

正在解析 Library.MainPresenter,(none) 正在解析构造函数参数“mainService”Library.MainPresenter(Library.IMainView mainView, Library.IMessageService messageService, Library.IMainService mainService) 正在解析 Library.IMainService,(none)

根据错误描述,我理解在创建MainPresenter并传递UnityContainer参数时,尝试创建一个接口对象,这当然是不可能的。但是我之前已经添加了“接口 - 类”到容器中并取出它,Unity必须创建相应的对象,然后将接口引用传递给它,结果会有很大不同。

抱歉我的英语表达不够流畅 : \

1个回答

1

有两个问题。

您缺少将`IMainService'注册为'MainService'的注册,例如:

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

而且你的 MainService 类没有声明为公共类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接