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