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

时间:2009-05-20 15:02:24

标签: c# winforms dependency-injection

我有一张表格:

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

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

我为每个人都有一个类型,我正在使用app.config来获取配置信息。但是,我不想为每个页面创建一个接口,只是为了注入,所以,我如何注入每个页面?

基本上,我在下面的type元素中放入了type属性,或者,我该怎么做?

  <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>

我正在使用Unity Framework,顺便说一句。

谢谢。

编辑:我得到了容器,然后我尝试使用这个注入:

Container.Configure<InjectedMembers>().ConfigureInjectionFor<mdiAuthenticationForm>();

2 个答案:

答案 0 :(得分:0)

我让它工作,不漂亮,但它的工作原理。最后一个问题是我必须在我的界面中包含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();
}

答案 1 :(得分:0)

基本上你想使用属性注入来注入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);

这应解决现有实例的依赖关系并将其连接起来。