十年河东,十年河西,莫欺少年穷
学无止境,精益求精
新建一个控制台程序,如下
MyAutoFac项目 引用Nuget autofac V6.5版本
新建如下接口:
public interface 动物
{
void 叫声();
public virtual void 干饭()
{
Console.WriteLine("吃主人准备好的饭菜");
}
}
实现类如下:
namespace MyService
{
public class 狗 : 动物
{
public void 叫声()
{
Console.WriteLine("汪汪汪");
}
public void 干饭()
{
Console.WriteLine("偶尔吃屎");
}
}
public class 猫 : 动物
{
public void 叫声()
{
Console.WriteLine("喵喵喵");
}
}
}
1、注入普通类
{
//注册一个普通类
ContainerBuilder builder = new ContainerBuilder();
builder.RegisterType<狗>().As<狗>();
IContainer container = builder.Build();
var 二哈 = container.Resolve<狗>();
二哈.干饭();
}
2、注入接口及实现类
{
//注册接口,及实现类
ContainerBuilder builder = new ContainerBuilder();
builder.RegisterType<猫>().As<动物>();
IContainer container = builder.Build();
var 中华田园猫 = container.Resolve<动物>();
中华田园猫.叫声();
}
3、通过程序集注入
3.1、仅注入service层
{
//通过程序集加载-->只加载Service
ContainerBuilder builder = new ContainerBuilder();
Assembly assemblyService = Assembly.LoadFrom("MyService.dll");
builder.RegisterAssemblyTypes(assemblyService).AsSelf();
IContainer container = builder.Build();
var 中华田园猫 = container.Resolve<猫>();
中华田园猫.叫声();
var 哈士奇 = container.Resolve<狗>();
哈士奇.叫声();
}
3.2、注入接口层和实现层
因为存在一个接口多个实现类,因此,需要解析为对象集合IEnumerable<动物>
{
//通过程序集加载
ContainerBuilder builder = new ContainerBuilder();
Assembly assemblyInterface = Assembly.LoadFrom("MyInterface.dll");
Assembly assemblyService = Assembly.LoadFrom("MyService.dll");
builder.RegisterAssemblyTypes(assemblyInterface, assemblyService).AsImplementedInterfaces();
IContainer container = builder.Build();
//---> 动物下的基类有猫和狗
var 动物集合 = container.Resolve<IEnumerable<动物>>();
foreach (var item in 动物集合)
{
item.干饭();
}
}
@天才卧龙的波尔卡