AutoFac在WinForm中的使用

版权声明:版权所有,需要请联系作者 https://blog.csdn.net/weixin_42930928/article/details/82767804

新建winform项目,命名为WfaAutoFacDemo,使用nuget添加autofac的引用,最新版为4.8.1,直接安装即可

 添加一个服务接口:IService和ISecondService,定义如下:

namespace WfaAutoFacDemo.Interface
{
    public interface IService
    {
        string Do();
    }

    public interface ISecondService : IService
    {
        string SecondDo();
    }

}

添加三个实体类,定义如下,第一个继承接口IService,第二个继承ISecondService,第三个没有继承接口:

namespace WfaAutoFacDemo.Model
{
    public class FirstModel : IService
    {
        private string first = "first";
        public string Do()
        {
            return first;
        }
    }

    public class SecondModel : ISecondService
    {
        private string second = "second";
        public string Do()
        {
            return second;
        }

        public string SecondDo()
        {
            return $"{second}-{second}";
        }
    }
    public class ThirdModel
    {
        private string third = "third";
        public string Do()
        {
            return third;
        }
    }
}

在form1中添加注册类型如下:

//在类中定义变量
private IContainer container;

//构造函数中添加如下代码
var builder = new ContainerBuilder();
            
builder.RegisterType<FirstModel>().Named<IService>("First");
builder.RegisterType<SecondModel>().Named<IService>("Second");
builder.RegisterType<SecondModel>().Named<ISecondService>("Second");
builder.RegisterType<ThirdModel>();
builder.RegisterInstance(this).As<Form>();
container = builder.Build();

form1中添加四个按钮,四个Label,

四个按钮的点击功能如下:

private void BtnFirstModel_Click(object sender, EventArgs e)
{
     var first =container.ResolveOptionalNamed<IService>("First");
     lblFirstModel.Text = first.Do();
}

private void BtnSecondModel_Click(object sender, EventArgs e)
{
     var second = container.ResolveOptionalNamed<IService>("Second");
     lblSecondModel.Text = second.Do();
}
private void BtnSecondModel2_Click(object sender, EventArgs e)
{
     var second = container.ResolveOptionalNamed<ISecondService>("Second");
     lblSecondModel2.Text = second.SecondDo();
}

private void BtnThirdModel_Click(object sender, EventArgs e)
{
     var third = container.Resolve<ThirdModel>();
     lblThirdModel.Text = third.Do();
}

 点击CTRL+F5,分别点击四个按钮,运行界面如下

 

注意:

1、对于不使用接口的类可以直接使用RegisterType

2、对于多个继承接口的,不能直接使用RegisterType,要RegisterType方法后再添加Named方法,并指定一个字符串

3、对于一个实体类继承接口,并且继承的接口又有父接口的,可以指定不同的接口类型,使用时可以根据需求选择不同的接口,如按钮SecondModel和SecondModel2选择了不同的接口进行了使用


猜你喜欢

转载自blog.csdn.net/weixin_42930928/article/details/82767804