代码之家  ›  专栏  ›  技术社区  ›  James Black

使用Unity框架,注入System.Windows.Forms.Form页面

  •  1
  • James Black  · 技术社区  · 15 年前

    我有一张表格:

    public partial class mdiAuthenticationForm : Form
        {
            public Services.Authentication.IAuthentication Authenticator { get; set; 
            public Services.Authentication.IAuthorization Authorizor { get; set; }
    

    我想为上面的两个属性注入具体的类。

    我为它们中的每一个都有一个类型,并且正在使用app.config来获取配置信息。但是,我不想为每个页面创建一个接口,只是为了注入,那么,我如何才能注入每个页面呢?

    基本上,我要在下面的类型元素中放入什么类型属性,或者,我如何才能这样做?

      <type type="" mapTo="mdiAuthenticationForm,project">
      <typeConfig extensionType="Microsoft.Practices.Unity.Configuration.TypeInjectionElement, Microsoft.Practices.Unity.Configuration">
          <property name="Authenticator" propertyType="Services.Authentication.IAuthentication,project">
            <dependency name="mssqlauth" />
          </property>
        <property name="Authorizor" propertyType="Services.Authentication.IAuthorization,project">
          <dependency name="mssqlautz" />
        </property>
      </typeConfig>
      </type>
    

    我正在为此使用统一框架,顺便说一句。

    谢谢您。

    编辑:我得到容器,然后我尝试使用以下方法进行注入:

    Container.Configure<InjectedMembers>().ConfigureInjectionFor<mdiAuthenticationForm>();
    
    2 回复  |  直到 15 年前
        1
  •  0
  •   Mehmet Aras    15 年前

    基本上,您希望使用属性注入来插入MDIAuthenticationForm的依赖项。你不能做如下的事情吗?

    在配置文件中添加类型映射:

    <container>
      <types>
        <type type="IAuthentication,PutAssemblyNameHere" mapTo="Authentication,PutAssemblyNameHere"/>
        <type type="IAuthorization,PutAssemblyNameHere" mapTo="Authorization,PutAssemblyNameHere"/>
        <type type="mdiAuthenticationForm,PutAssemblyNameHere"/>
      </types>
    </container>
    

    将依赖属性放在身份验证和授权属性上。

    [Dependency]
    public Services.Authentication.IAuthentication Authenticator { get; set;} 
    [Dependency]
    public Services.Authentication.IAuthorization Authorizor { get; set; }
    

    最后,在代码中,执行以下操作以获取MDIAuthenticationForm的实例:

    mdiAuthenticationForm form = container.Resolve<mdiAuthenticationForm>(); 
    

    如果不想在配置文件中添加MDIAuthentication,也可以执行以下操作:

    mdiAuthenticationForm form = new mdiAuthenticationForm();
    container.BuildUp<mdiAuthenticationForm>(form);
    

    这应该解决对现有实例的依赖,并将它们连接起来。

        2
  •  0
  •   James Black    15 年前

    我让它工作了,不漂亮,但它工作了。最后一个问题是,我必须在界面中包含Form.ShowDialog。

    首先是我的代码的主要部分,它从program.cs创建并调用表单,然后是我的接口。我希望这是模态的,这就是我使用ShowDialog的原因。我还将这两个属性移动到了一个新的控制器中,但是我仍然有一个属性要设置,以确保它正常工作。

        container.Configure<InjectedMembers>().ConfigureInjectionFor<IAuthenticationForm>();
        containers.Configure(container);
        IAuthenticationForm f = container.Resolve<IAuthenticationForm>();
        f.ShowDialog();
    
    
    public interface IAuthenticationForm
    {
        Optimal4.Services.Authentication.IAuthorization Authorizor { get; set; }
        void checkAuthentication();
        System.Windows.Forms.DialogResult ShowDialog();
    }