第一次整理了下關於autofac的一些具體的用法 1. 安裝 Autofac: Install-Package Autofac -Version 4.8.1 2. 創建兩個類庫項目,IService (用於編寫介面),ServiceImpl(用於創建實現類) IService 下 public in ...
第一次整理了下關於autofac的一些具體的用法
1. 安裝 Autofac: Install-Package Autofac -Version 4.8.1
2. 創建兩個類庫項目,IService (用於編寫介面),ServiceImpl(用於創建實現類)
- IService 下
public interface IAnimalBark
{
void Bark();
}
public interface IAnimalSleep
{
void Sleep();
}
public interface IUser
{
void AddNew(string name, string pwd);
}
public interface ISchool
{
void AfterSchool();
}
- ServiceImpl下
public class Dog : IAnimalBark,IAnimalSleep
{
public void Bark()
{
Console.WriteLine("汪汪汪汪汪");
}
public void Sleep()
{
Console.WriteLine("zZ,睡著了");
}
}
public class Cat : IAnimalBark
{
public void Bark()
{
Console.WriteLine("喵喵喵");
}
}
public class User : IUser
{
public void AddNew(string name, string pwd)
{
Console.WriteLine("添加新的用戶:" + name);
}
}
public class School : ISchool
{
public IAnimalBark dog { get; set; }
public void AfterSchool()
{
dog.Bark();
Console.WriteLine("放學了");
}
}
3. 原理性使用方法,如果再有一個介面和一個實現類,那就再註冊一次
ContainerBuilder builder = new ContainerBuilder();
//註冊實現類Dog,當我們 請求IAnimalBark介面 的時候返回的是類Dog的對象,原理性的代碼
builder.RegisterType<Dog>().As<IAnimalBark>();
//上面一句也可改成下麵一句,這樣 請求Dog實現的任何介面 的時候都會返回Dog對象,原理性的代碼
//builder.RegisterType<Dog>().AsImplementedInterfaces();
IContainer container = builder.Build();
//請求IAnimalBark介面
IAnimalBark dog = container.Resolve<IAnimalBark>();
dog.Bark();
Console.ReadKey();
4. 如果有很多介面,很多實現類,每次都要註冊一次會很麻煩,可以如下進行一次註冊
ContainerBuilder builder = new ContainerBuilder();
Assembly asm = Assembly.Load("Service");//實現類所在的程式集名稱
builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces();//常用
IContainer container = builder.Build();
IAnimalBark dog = container.Resolve<IAnimalBark>();
IUser user = container.Resolve<IUser>();
dog.Bark();
user.AddNew("baidu","123");
Console.ReadKey();
5. 如果有多個實現類,container.Resolve<IAnimalBark>();只會返回其中一個對象,如果想返回多個類的對象,應改成container.Resolve<IEnumerable<IAnimalBark>>();
ContainerBuilder builder = new ContainerBuilder();
Assembly asm = Assembly.Load("Service");//實現類所在的程式集名稱
builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces();//常用
IContainer container = builder.Build();
IEnumerable<IAnimalBark> animals = container.Resolve<IEnumerable<IAnimalBark>>();
foreach(var animal in animals)
{
animal.Bark();
}
Console.ReadKey();
6. 如果一個實現類中定義了其他類型的屬性(介面類型的屬性),在註冊時又加上builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces().PropertiesAutowired();這樣會給屬性進行“註入”
ContainerBuilder builder = new ContainerBuilder();
Assembly asm = Assembly.Load("Service");//實現類所在的程式集名稱
builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces().PropertiesAutowired();//常用
IContainer container = builder.Build();
ISchool school = container.Resolve<ISchool>();
school.AfterSchool();
Console.ReadKey();
7. 可以通過在builder.RegisterAssemblyTypes(asm)後面以 Instance***()配置來實現Auto對象的生命周期
- InstancePerDependency()每次Resolve都返回新的對象
ContainerBuilder builder = new ContainerBuilder();
Assembly asm = Assembly.Load("Service");//實現類所在的程式集名稱
builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces().PropertiesAutowired().InstancePerDependency();//常用
IContainer container = builder.Build();
ISchool school = container.Resolve<ISchool>();
ISchool school2 = container.Resolve<ISchool>();
Console.WriteLine(school.Equals(school2));
Console.ReadKey();
- SingleInstance()每次Resolve都返回同一個對象,推薦
ContainerBuilder builder = new ContainerBuilder();
Assembly asm = Assembly.Load("Service");//實現類所在的程式集名稱
builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces().PropertiesAutowired().SingleInstance();//常用
IContainer container = builder.Build();
ISchool school = container.Resolve<ISchool>();
ISchool school2 = container.Resolve<ISchool>();
Console.WriteLine(object.ReferenceEquals(school,school2));
Console.ReadKey();