windows窗体中的权限

本文关键字:权限 窗体 windows | 更新日期: 2023-09-27 17:50:29

我们在Windows Forms中开发了一个ERP系统,用户需要在整个系统中拥有粒度权限。为了实现这一点,每个表单都有自己的exe。我们有一个主菜单,我们添加一个MenuItem到数据库,然后我们可以给用户访问权限。然后,我们将通过Guid传递给每个exe作为"会话"的id。在启动exe之前检查权限,而不是由exe本身检查权限。

所以我们的"主菜单"是建立这些exe的表是"Id, Title, exe,…,…"。

所以多年来项目不断发展,我们现在有一个解决方案,其中有800多个小项目和4个共享的dll(数据,BL,UI,打印)。我们的VS解决方案确实在性能上挣扎。

我正在考虑将表单组合到几个项目中,使用自定义属性来使用反射来构建菜单。我想然后,而不是启动一个exe我们会使用反射来实例化的形式和显示它?这是最好的解决办法吗?或者有一些为Windows窗体设计的框架可以处理这个问题?

这也会提高VS的性能吗?相同数量的代码只是更少的项目?

除此之外,我们还有用于启用/禁用控件的应用内权限。虽然我不认为他们会受到影响。

windows窗体中的权限

我不确定您的中间步骤,但我最近在erp系统中使用的一种方法是使用命令模式的变体。如果你在命令中放入逻辑来检查安全性并启动表单或类似的形式,那么你可以使用反射来定位命令或在启动时定位它们并将它们存储在列表中。无论哪种方法,都相对简单。

public interface ICommand
{
    Guid GetUniqueId();
    bool Execute();
}

那么实际的命令可以像

  public class YourWinformCommand: ICommand
    {
        private User _user;
        private Guid _securityCode = new Guid(".......");
        public Guid GetUniqueId()
        {
            return _securityCode;
        }
        public  bool Execute()
        {
            if (_user.HasAccessTo(_securityCode))
            {
                //Load the winform here.
                return true
            }
             return false;
        }
    }

使用每个入口点的命令,您应该能够将winform合并为逻辑集并将它们放置在dll中。现在,一旦完成,使用反射通过接口定位给定命令并测试标识符

    /// <summary>
    /// This class contains methods to construct a concrete object from an interface.
    /// </summary>
    public static class ServiceFactory
    {

        /// <summary>
        /// Builds a concrete instance of an interface
        /// </summary>
        /// <typeparam name="T">The interface of the object</typeparam>
        /// <returns>If found, a concrete object is returned that implements the interface</returns>
        public static T Build<T>() where T : class
        {
            string applicationPath = AppDomain.CurrentDomain.BaseDirectory;
            string[] files = Directory.GetFiles(applicationPath, "*.dll");
            foreach (string file in files)
            {
                // Dynamically load the selected assembly.
                Assembly theAssembly = Assembly.LoadFrom(file);
                // See if the type implements T.
                foreach (Type type in theAssembly.GetTypes())
                {
                    if (ImplementsInterface(type, typeof(T)))
                    {
                        // Use late binding to create the type.
                        return (T) theAssembly.CreateInstance(type.FullName);
                    }
                }
            }
            return null;
        }
        public static bool ImplementsInterface(this Type type, Type ifaceType)
        {
            return type.GetInterfaces().Any(x => x == ifaceType);
        }
}

从该代码中修改它以将guid包含在等式中,或者修改它以返回所有命令,由您选择。

希望能有所帮助。