AutoFac在WinForm中的使用

本文通过创建WinForm项目并使用Autofac进行依赖注入,演示了如何定义服务接口和服务实现类,以及如何在应用程序中注册这些类型并解决依赖。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

新建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选择了不同的接口进行了使用


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值