Anno.Core icon indicating copy to clipboard operation
Anno.Core copied to clipboard

请教 Assemblys 服务集合 跟 AppSettings.IocDll Ioc插件DLL列表

Open oneheed opened this issue 2 years ago • 3 comments

Assemblys 服务集合 AppSettings.IocDll Ioc插件DLL列表

这个Assemblys 服务集合 跟 Ioc插件DLL列表 资料我看是一样是否有什么特别的需求,需要分开存入

oneheed avatar Aug 09 '23 15:08 oneheed

这个不需要干预,配置文件中的iocDll 是为了让ioc 容器扫描程序集加入ioc容器。现在 模块之间有依赖可以参考这个示例https://github.com/duyanming/Anno.Core/blob/master/samples/Packages/Anno.Plugs.SoEasyService/SoEasyBootStrap.cs

duyanming avatar Aug 13 '23 00:08 duyanming

using Anno.EngineData; using System;

namespace Anno.Plugs.SoEasyService { ///

/// 插件启动引导器 /// DependsOn 依赖的类型程序集自动注入DI容器 /// [DependsOn( typeof(SoEasy.Application.AppBootstrap) //typeof(Domain.Bootstrap) //, typeof(QueryServices.Bootstrap) //, typeof(Repository.Bootstrap) //, typeof(Command.Handler.Bootstrap )] public class SoEasyBootStrap : IPlugsConfigurationBootstrap { /// /// Service 依赖注入构建之后调用 /// public void ConfigurationBootstrap() { //throw new NotImplementedException(); } /// /// Service 依赖注入构建之前调用 /// /// public void PreConfigurationBootstrap() { //throw new NotImplementedException(); } } }

duyanming avatar Aug 13 '23 00:08 duyanming

对哥写架构有兴趣,所以想了解一下如何设计

    /// <summary>
    /// 服务集
    /// </summary>
    public static class Assemblys
    {
        /// <summary>
        /// 服务集合
        /// </summary>
        public static readonly Dictionary<string, Assembly> Dic = new Dictionary<string, Assembly>();
        /// <summary>
        /// Ioc模块DLL列表
        /// </summary>
        public static List<Assembly> DependedTypes { get; set; } = new List<Assembly>();
    }
    
    
    public static class AppSettings
    {
        /// <summary>
        /// 数据库连接字符串
        /// </summary>
        public static String ConnStr { get; set; }

        /// <summary>
        /// 用户重置密码的时候的默认密码
        /// </summary>
        public static String DefaultPwd { get; set; } = "Anno";
        
        /// <summary>
        /// Ioc插件DLL列表
        /// </summary>
        public static List<string> IocDll { get; set; } = new List<string>();        
    }

AppSettings 的 Add IocDll

  1. 透过 Anno.config 的 IocDll/Assembly
  2. 透过 Anno.config 的 <FuncName></FuncName>
  3. 根目录 Anno.Plugs.{xxx}Service.dll
  4. Packages/ 里面的 Anno.Plugs.{xxx}Service.dll
  5. 单文件

Assemblys 的 Dic

  1. 透过 Anno.config 的 <FuncName></FuncName>
  2. 根目录 Anno.Plugs.{xxx}Service.dll
  3. Packages/ 里面的 Anno.Plugs.{xxx}Service.dll
  4. 单文件

RegisterIoc 透过 AppSettings.IocDll 参数, 去将实体注入容器为什么不用直接用 Const.Assemblys.Dic

        public static IServiceCollection UseDependencyInjection(this IServiceCollection services)
        {
            //已经加载过的不再重新加载
            if (loader)
            {
                return services;
            }
            Const.AppSettings.IocDll.Distinct().ToList().ForEach(d =>
            {
                RegisterAssembly(services, Const.Assemblys.Dic[d]);
            });
            foreach (var assembly in Const.Assemblys.DependedTypes)
            {
                RegisterAssembly(services, assembly);
            }
            loader = true;
            return services;
        }

因为底下 PreConfigurationBootstrap 也是直接使用 Const.Assemblys.Dic

        /// <summary>
        /// IOC注入之前插件事件
        /// </summary>
        private static void PreConfigurationBootstrap()
        {
            foreach (var svc in Const.Assemblys.Dic)
            {
                InvokeDependedTypesAssemblies(svc.Value);
            }
        }

oneheed avatar Aug 14 '23 09:08 oneheed