侧边栏壁纸
博主头像
陌上花 博主等级

回首万事皆休

  • 累计撰写 70 篇文章
  • 累计创建 11 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

CSharp之Autofac注入

种向日葵的人
2024-08-30 / 0 评论 / 0 点赞 / 17 阅读 / 1471 字

Why

  • 因为最近我自己打算开始一个新项目了,需要使用到依赖注入,之前我使用的也是Autofac,公司的依赖注入就是我写的,但是之前没有写成博客,这次正好记录一下。

How

安装

  • 直接使用VSNuget安装,推荐以下两个都安装。
    autofac_nuget.png

代码部分

  • 因为我比较喜欢直接使用dll进行注册,同时添加自定义的Attribute,实现加载的类过滤,同时需要注册继承的接口。
  • 自定义Attribute
public enum LoadEnum
{
    //单例
    Singleton,

    InstancePerLifetimeScope,

    InstancePerDependency,
}

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class LoadAttribute : Attribute
{
    public LoadEnum LoadType => loadType;
    private LoadEnum loadType;
    public LoadAttribute(LoadEnum loadType = LoadEnum.Singleton)
    {
        this.loadType = loadType;
    }
}
  • 依赖注入助手类
public static class LoadHelper
{
    public static IContainer? Container => container;

    private static ContainerBuilder? builder;

    private static IContainer? container;
    public static bool Load(string dllName)
    {
        //加载dll
        try
        {
            var assembly = Assembly.LoadFrom(dllName);
            builder = new ContainerBuilder();
            //遍历所有类
            foreach (Type type in assembly.GetTypes())
            {
                var loadAttribute = type.GetCustomAttribute<LoadAttribute>();
                if (loadAttribute == null)
                    continue;
                //先注册其本身
                //查找类中所有的接口
                var interfaces = type.GetInterfaces();

                switch (loadAttribute.LoadType)
                {
                    case LoadEnum.Singleton:
                        {
                            builder.RegisterType(type).SingleInstance().As(interfaces).AsSelf();
                        }

                        break;
                    case LoadEnum.InstancePerLifetimeScope:
                        {
                            builder.RegisterType(type).InstancePerLifetimeScope().As(interfaces).AsSelf();
                        }
                        break;
                    case LoadEnum.InstancePerDependency:
                        {
                            builder.RegisterType(type).InstancePerDependency().As(interfaces).AsSelf();
                        }
                        break;

                    default:
                        break;
                }

            }

        }
        catch (Exception ex)
        {
            LoggerHelper.Error(ex);
            return false;
        }
        return true;

    }

    public static void Build()
    {
        container = builder?.Build();
    }
}
<已自动折叠>
  • 注意其中的LoggerHelper是日志类,可以忽略或者注释。
  • 使用示例(仅作参考,可以自行操作)
LoadHelper.Load("PQSoft.dll");
LoadHelper.Build();

var iLoad = LoadHelper.Container.Resolve<ILoad>();

Tips

  • 注意,在依赖注入的时候其实是有顺序要求的,我目前测试的只有这种方法可以同时注册其本身类和所有的接口。
  • 很简单,仅做记录,以后自己方便使用。
0
博主关闭了所有页面的评论