今日インタビューに行ったところ、インタビュアーがAutoFacが自動プロセスをどのように実現しているかを尋ねました。私は圧倒されました。私は通常、コードを移動して、詳細な調査なしで使用するだけです。この経験はレッスンと見なすことができます。戻ってきた後、実装プロセスを研究し、それを記録するためのメモを書きました。
1つは、依存性注入インターフェースです。
まず、依存性注入のインターフェースを紹介します
1.マークされたインターフェースが宣言され、このインターフェースから継承されたものがすべて示されます
/// <summary>
/// 依赖注入接口,表示该接口的实现类将自动注册到IoC容器中
/// </summary>
public interface IDependency
{
}
2.追加、削除、変更、およびチェックの一般的な方法をカプセル化するために、基本的なインターフェースが宣言されています
public interface IBaseContract<T> : IDependency
{
IQueryable<T> Entities {
get; }
//OperationResult 是自己封装的一个操作结果,不用在意
OperationResult Insert(params T[] entities);
OperationResult Update(params T[] entities);
T View(int Id);
}
3.特定のエンティティクラスインターフェイスを宣言すると、いくつかの一意のメソッドをインターフェイスにカプセル化できます
public interface IStudentContract : IBaseContract<Student>
{
string GetName();
}
4.
コントローラーのコンストラクターでUseを使用します
public class HomeController : Controller
{
private IStudentContract _student;
public HomeController(IStudentContract student)
{
_student = student;
}
public ActionResult Index()
{
return Content(_student.GetName());
}
}
2.自動注入プロセス
protected void AutofacRegister()
{
var builder = new ContainerBuilder();
/* 1、注册
* RegisterGeneric:注册非参数化泛型类型:RegisterGeneric(typeof(类)).As(typeof(接口))
* RegisterType:通过RegisterType<类>.As<接口>() 来注册不是泛型的类
*/
builder.RegisterGeneric(typeof(Repository<,>)).As(typeof(IRepository<,>));
/* 2、获取接口类型
* 通过IDependency标记需要依赖注入的接口
* 注册所有实现了IDependency接口的类型
*/
Type baseType = typeof(IDependency);
/* 3、获取所有程序集
* 当CLR COM服务器初始化时,它会创建一个AppDomain。 AppDomain是一组程序集的逻辑容器
*/
//var assemblies = AppDomain.CurrentDomain.GetAssemblies();//这种写法AppDomain重新启动后会丢失程序集
var assemblies = System.Web.Compilation.BuildManager.GetReferencedAssemblies().Cast<Assembly>().ToArray();
/* 4、自动注册接口
* 筛选出对应条件的接口
* IsAssignableFrom:返回true的条件:是否直接或间接实现了IDependency
* IsAbstract:是否为抽象类
* AsImplementedInterfaces:以接口的形式注册
* InstancePerLifetimeScope:同一个Lifetime生成的对象是同一个实例
*/
builder.RegisterAssemblyTypes(assemblies)
.Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract) .AsImplementedInterfaces().InstancePerLifetimeScope();
/*5、自动注册MVC与api控制器
*/
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
IContainer container = builder.Build();
/*6、ApiController WebApi注入
*/
var webapiresolver = new AutofacWebApiDependencyResolver(container);
GlobalConfiguration.Configuration.DependencyResolver = webapiresolver;
/*7、mvc注入
*/
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
Application_StartメソッドでAutofacRegister()を呼び出します