Caliburn.Micro使用Autofac

using Autofac;
using Caliburn.Micro;

namespace ST.ERMS.AutFac
{
    public class AutFacContainer : BootstrapperBase
    {
        /// <summary>
        /// 
        /// </summary>
        private IContainer container;
        /// <summary>
        /// 
        /// </summary>
        private ContainerBuilder builder;

        /// <summary>
        /// 记录日志
        /// </summary>
        private ILogEntity runLog;

        public AutFacContainer()
        {
            Initialize();
        }

        private void BuilderContainer()
        {
            builder = new ContainerBuilder();

            #region 注册配置

            var config = this.BuildConfig();
            builder.RegisterInstance(config);

            #endregion

            #region 注册日志

            //builder.RegisterType<LogProviderOfLog4net>().As<ILogProvider>();

            #endregion

            #region 注册缓存

            //builder.RegisterType<DefaultCacheManager>().As<ICacheManagerService>().SingleInstance();
            //builder.RegisterType<DefaultCacheProvider>().As<ICacheProvider>().SingleInstance();

            #endregion

            #region 注册freesql

            RegisterDb<ERMSDbContext>(builder, config, true);

            #endregion

            // 注册服务
            builder.RegisterType<CommNetServer>().SingleInstance();

            // 注册单例用户
            builder.RegisterType<LoginUserInfo>().SingleInstance();

            // 注册加密类
            builder.RegisterType<EncryptHelper>().As<IEncryptHelper>().SingleInstance();

            //#region 注册日志
            builder.RegisterType<RunLog>().As<ILogEntity>().InstancePerLifetimeScope();
            //#endregion

            //AppDomain.CurrentDomain.Load("ST.ERMS");
            var allAssemblies = AppDomain.CurrentDomain.GetAssemblies();
            var assembiles = allAssemblies.Where(x => x.ManifestModule.Name.Contains("ST.ERMS")).ToArray();

            #region 注册服务
            builder.RegisterAssemblyTypes(allAssemblies)
                .Where(type => typeof(ITransient).IsAssignableFrom(type) && !type.IsAbstract)
                .AsImplementedInterfaces()
                .InstancePerLifetimeScope();

            #endregion

            #region 注册视图模型
            builder.RegisterType<PropertyChangedBase>().InstancePerLifetimeScope();
            builder.RegisterType<WindowManager>().As<IWindowManager>().SingleInstance();
            builder.RegisterType<EventAggregator>().As<IEventAggregator>().InstancePerLifetimeScope();

            builder.RegisterType<AppMainShellViewModel>().As<IAppBaseShell>().InstancePerLifetimeScope();


            builder.RegisterAssemblyTypes(allAssemblies)
                .Where(type => typeof(BaseListViewModel).IsAssignableFrom(type) && !type.IsAbstract)
                .AsSelf();

            builder.RegisterAssemblyTypes(allAssemblies)
                .Where(type => typeof(Caliburn.Micro.Screen).IsAssignableFrom(type) && !type.IsAbstract)
                .AsSelf();

            #endregion
        }

        /// <summary>
        /// 构建配置
        /// </summary>
        /// <returns></returns>
        private ConfigInfo BuildConfig()
        {
            string temp = string.Empty;
            var config = new ConfigInfo();

            config.WMSConn = ConfigurationManager.ConnectionStrings["WMSConn"].ConnectionString;
            config.ProviderName = ConfigurationManager.ConnectionStrings["WMSConn"].ProviderName;
            config.DBType = ConfigurationManager.AppSettings["DBType"].Trim();

            return config;
        }

        /// <summary>
        /// 注册数据库
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="builder"></param>
        /// <param name="cfg"></param>
        /// <param name="useAutoSyncStructure"></param>
        private void RegisterDb<T>(ContainerBuilder builder, ConfigInfo cfg, bool useAutoSyncStructure) where T : BaseDbContext
        {
            var build = new FreeSql.FreeSqlBuilder();
            var dbType = FreeSql.DataType.SqlServer;
            if (!string.IsNullOrEmpty(cfg.ProviderName))
            {
                if (cfg.ProviderName.ToLower() == "mysql.data.mysqlclient")
                    dbType = FreeSql.DataType.MySql;
                else if (cfg.ProviderName.ToLower() == "system.data.sqlite")
                    dbType = FreeSql.DataType.Sqlite;
            }
            else
            {
                if (cfg.DBType.ToUpper() == "MYSQL")
                {
                    dbType = FreeSql.DataType.MySql;
                }
                else if (cfg.DBType == "SQLITE")
                {
                    dbType = FreeSql.DataType.Sqlite;
                }
            }

            build = build.UseConnectionString(dbType, cfg.WMSConn);
            IFreeSql freeSql = build.UseAutoSyncStructure(useAutoSyncStructure)
                .UseMonitorCommand(
                    cmd =>
                    {
                        string commandText = cmd.CommandText;
                        //RunLog log = new RunLog();
                        //log.LogInfo2File("执行前:\r\n" + commandText);

                        Console.WriteLine(cmd.CommandText);
                    }, //监听SQL命令对象,在执行前
                    (cmd, traceLog) =>
                    {
                        string traceLogText = traceLog;
                        //RunLog log = new RunLog();
                        //log.LogInfo2File("执行后:\r\n" + traceLog);

                        //Console.WriteLine(traceLog);
                    }) //监听SQL命令对象,在执行后
                       //.UseLazyLoading(true)
                .Build();
            builder.RegisterInstance(freeSql).SingleInstance();
            builder.RegisterType<T>()
                .WithParameter(new NamedParameter("freeSql", freeSql) { })
                .InstancePerLifetimeScope();

            // AOP拦截
            freeSql.Aop.CurdBefore += (s, e) =>
            {
                if (e.CurdType == FreeSql.Aop.CurdType.Delete)
                {
                }
            };
        }

        protected override void Configure()
        {
            BuilderContainer();

            container = builder.Build();
            runLog = container.Resolve<ILogEntity>();
        }

        protected override object GetInstance(Type service, string key)
        {
            try
            {
                return key == null ? container.Resolve(service) : container.ResolveNamed(key, service);
            }
            catch(Exception ex)
            {
                runLog.LogError2File("GetInstance: " + ex.Message);
            }

            try
            {
                return base.GetInstance(service, key);
            }
            catch (Exception ex)
            {
                runLog.LogError2File("GetInstance: " + ex.Message);
            }

            return null;
        }

        protected override IEnumerable<object> GetAllInstances(Type service)
        {
            try
            {
                var type = typeof(IEnumerable<>).MakeGenericType(service);
                return container.Resolve(type) as IEnumerable<object>;
            }
            catch(Exception ex)
            {
                runLog.LogError2File("GetAllInstances: " + ex.Message);
            }

            try
            { 
                return base.GetAllInstances(service);
            }
            catch (Exception ex)
            {
                runLog.LogError2File("GetAllInstances: " + ex.Message);
            }

            return null;
        }

        protected override void BuildUp(object instance)
        {
            try
            {
                container.InjectProperties(instance);
            }
            catch (Exception ex)
            {
                runLog.LogError2File("BuildUp: " + ex.Message);
                base.BuildUp(instance);
            }            
        }

        protected override void OnStartup(object sender, System.Windows.StartupEventArgs e)
        {
            // 不带登录窗口
            //DisplayRootViewFor<IAppBaseShell>();
            //System.Windows.Application app = ((System.Windows.Application)(sender));
            //if (app != null && app.Windows != null && app.Windows.Count > 0)
            //{
            //    app.Windows[0].WindowState = System.Windows.WindowState.Maximized;
            //}

            // https://stackoverflow.com/questions/11966698/how-do-i-handle-login-logout-in-caliburn-micro
            var vm = IoC.Get<LoginViewModel>();
            vm.LoginSuccessful =
                () => GuardCloseAndReopen(sender, e, vm);

            var windowManager = IoC.Get<IWindowManager>();          
            var result = Utils.OpenDialog(windowManager, vm);
        }

        private void GuardCloseAndReopen(object sender, System.Windows.StartupEventArgs e, Caliburn.Micro.Screen vm)
        {
            DisplayRootViewFor<IAppBaseShell>();
            System.Windows.Application app = ((System.Windows.Application)(sender));
            if (app != null && app.Windows != null && app.Windows.Count > 0)
            {
                foreach(Window item in app.Windows)
                {
                    if (item is AppMainShellView)
                    {
                        item.WindowState = System.Windows.WindowState.Maximized;
                        break;
                    }
                }
            }

            //Application.ShutdownMode = ShutdownMode.OnExplicitShutdown;
            vm.TryCloseAsync(true);
            //Application.ShutdownMode = ShutdownMode.OnLastWindowClose;
        }

        protected override void OnExit(object sender, EventArgs e)
        {
            
        }

        protected override void OnUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
        {
            e.Handled = true;

            runLog.LogError2File("OnUnhandledException: " + e.Exception.Message);
        }
    }

    public interface IAppBaseShell
    {

    }
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Caliburn.Micro是一个轻量级的MVVM框架,它可以帮助你更轻松地编写WPF、UWP、WinRT、Windows Phone和Silverlight应用程序。以下是一些使用Caliburn.Micro的好处和建议: 1. MVVM架构:Caliburn.Micro基于MVVM架构,这使得你的代码更加容易维护和测试。你可以将应用程序分解成视图、视图模型和模型,这有助于你保持代码的分离和可读性。 2. 可扩展性:Caliburn.Micro是一个非常灵活的框架,它可以与许多其他框架和库集成。例如,你可以使用Caliburn.Micro与.NET Core、ReactiveUI、Autofac等等。 3. 命令绑定:Caliburn.Micro提供了一个简单的方法来绑定命令。你可以使用它来处理按钮点击、菜单项点击等事件。 4. 依赖注入:Caliburn.Micro包含一个简单的依赖注入容器,这使得你可以更容易地管理应用程序中的依赖关系。 5. 事件聚合器:Caliburn.Micro包含一个事件聚合器,这使得你可以更轻松地在应用程序中进行通信和事件处理。 如果你打算使用WPF或UWP来构建你的应用程序,那么我强烈推荐你使用Caliburn.Micro框架。它可以大大简化你的开发过程,使得你可以更加专注于实现业务逻辑和用户体验。 ### 回答2: Caliburn.Micro是一个开源的MVVM(Model-View-ViewModel)框架,可以帮助开发人员更轻松地构建WPF(Windows Presentation Foundation)和Silverlight应用程序。以下是我为什么推荐使用Caliburn.Micro的几个理由: 1. 简化MVVM开发模式:Caliburn.Micro使用约定优于配置的原则,采用了一系列命名规则和自动绑定功能来帮助开发人员快速构建MVVM应用程序,减少了繁琐的代码编写工作。 2. 低代码开发:相比于其他MVVM框架,Caliburn.Micro的代码量相对较少,而且框架已经内置了很多常见的功能,如路由导航、事件聚焦等,这些功能可以帮助开发人员减少代码编写,快速实现各种业务需求。 3. 容易扩展和定制:Caliburn.Micro框架提供了很多可扩展的点,可以根据自己的业务需求进行定制和扩展。通过使用框架提供的IoC容器和事件聚焦功能,可以方便地实现模块化开发和松耦合。 4. 强大的应用生命周期管理:Caliburn.Micro提供了全面的应用程序生命周期管理功能,包括应用程序的启动、关闭、暂停和恢复等。这些功能可以帮助开发人员更好地控制应用程序的状态和行为。 5. 大量的文档和社区支持:Caliburn.Micro在开源社区中有着广泛的应用和活跃的社区支持。它的官方网站上提供了大量的文档、示例代码和教程,方便开发人员学习和使用框架。 总的来说,Caliburn.Micro是一个功能强大、简化开发、易于扩展和定制的MVVM框架,适用于构建WPF和Silverlight应用程序。如果你想提高开发效率,同时保持代码的整洁和可扩展性,我强烈推荐你使用Caliburn.Micro。 ### 回答3: Caliburn.Micro是一个轻量级的MVVM(模型-视图-视图模型)框架,它能够帮助我们更轻松地开发WPF、Silverlight和Windows Phone应用程序。 首先,Caliburn.Micro具有简单易用的语法。它使用了一些约定来自动绑定视图和视图模型之间的关系,减少了冗余的代码量。例如,只需按照约定命名视图和视图模型,框架就会自动找到它们并建立绑定关系。 其次,Caliburn.Micro提供了一个灵活的导航系统。我们可以使用导航器来导航到不同的视图和视图模型,而无需直接在代码中管理窗口和页面的切换。这使得应用程序的导航逻辑更加清晰和可维护。 另外,Caliburn.Micro还提供了事件聚合器和消息机制,用于实现视图模型之间的松耦合通信。我们可以发送和订阅事件,通过消息来传递数据和触发操作,简化了模块间的交互。 最后,Caliburn.Micro还有一个活跃的社区支持。我们可以在官方网站上找到详细的文档和示例代码,以及各种问题的解决方案。社区成员也经常发布新的更新和扩展,使得框架的功能更加丰富和强大。 总结而言,Caliburn.Micro是一个强大且易用的MVVM框架,适用于开发WPF、Silverlight和Windows Phone应用程序。它的简单语法、灵活导航、松耦合通信和活跃的社区支持,使得我们能够更高效地开发出优秀的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值