Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 统一IoC与Windows From_C#_Winforms_Unity Container_Ioc Container - Fatal编程技术网

C# 统一IoC与Windows From

C# 统一IoC与Windows From,c#,winforms,unity-container,ioc-container,C#,Winforms,Unity Container,Ioc Container,所以我有这样一个程序架构(LibraryManager): 数据访问层具有类,该类必须管理数据并与演示者通信 public interface ILibraryDataManager { //some code... } public class LibraryDataManager:ILibraryDataManager { //some code... } 实现一个原语,不要停留在注意。。。 接下来,在主项目实施类中: MessageService-能够在程序中的任何位

所以我有这样一个程序架构(LibraryManager):

数据访问层具有类,该类必须管理数据并与演示者通信

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();
    }
}
以下内容除外:

Microsoft.Practices.Unity.ResolutionFailedException未处理 HResult=-2146233088消息=依赖项解析失败,类型 =“Library.MainPresenter”,name=“(无)”。解析时发生异常。异常为:InvalidOperationException-当前 类型Library.IMainService是一个接口,无法构造。 是否缺少类型映射? -----------------------------------------------发生异常时,容器为:

正在解析Library.MainPresenter,(无)正在解析参数 构造函数库的“mainService”。MainPresenter(Library.IMainView 主视图,Library.IMessageService消息服务,Library.IMainService mainService)正在解析Library.IMainService(无)

据我所知,这是基于创建MainPresenter期间的错误描述,并将试图创建接口对象的UnityContainer参数传递给它,这当然是不可能的。但是在这之前我已经在容器中添加了“接口类”,Unity必须创建一个相应的对象,然后将接口引用传递给它,结果是完全不同的

对不起,我的英语不好:\

有两个问题

您缺少“IMainService”到“MainService”的注册,例如:

container.RegisterType<ILibraryDataManager, LibraryDataManager>()
         .RegisterType<IMainService, MainService>()
container.RegisterType()
.RegisterType()
并且您的
MainService
类未声明为public

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