C# 一个DLL,两个应用程序有两个实现

C# 一个DLL,两个应用程序有两个实现,c#,dll,C#,Dll,我有一个带有一些类和方法的DLL。以及两个使用它的应用程序。 一个需要几乎所有方法的管理应用程序和一个只需要部分内容的客户端应用程序。但其中很大一部分都被他们两人使用。现在我想做一个包含管理员内容的DLL和一个包含客户端内容的DLL 每次复制DLL和手动编辑都很糟糕 也许条件编译对我有帮助,但我不知道如何在三个项目的一个解决方案中用不同的编码编译DLL两次 对于这个问题,有没有比使用两个不同的DLL并在每次更改时手动编辑更好的方法?一般来说,您可能不希望在客户端公开管理代码。因为它是一个DLL,

我有一个带有一些类和方法的DLL。以及两个使用它的应用程序。 一个需要几乎所有方法的管理应用程序和一个只需要部分内容的客户端应用程序。但其中很大一部分都被他们两人使用。现在我想做一个包含管理员内容的DLL和一个包含客户端内容的DLL

  • 每次复制DLL和手动编辑都很糟糕
  • 也许条件编译对我有帮助,但我不知道如何在三个项目的一个解决方案中用不同的编码编译DLL两次

  • 对于这个问题,有没有比使用两个不同的DLL并在每次更改时手动编辑更好的方法?

    一般来说,您可能不希望在客户端公开管理代码。因为它是一个DLL,所以该代码正等待被利用,因为这些方法必然是公共的。更不用说反编译.NET DLL是件小事,它可能会暴露您的管理员程序的内部工作,而您确实不希望非管理员看到这些工作

    如果要最大限度地减少代码重复,最好的方法(尽管不一定是“最简单的”)是使用3个DLL:

  • 仅包含两个应用程序都使用的函数的公共库
  • 一个只有管理员应用程序才会使用的库(或者,如果没有其他应用程序使用这些函数,则直接将其编译到应用程序中)
  • 只有客户端应用程序才会使用的库(与上面的警告相同)
  • 由服务器、客户端和管理客户端组成的项目可能有3-4个库:

  • 公共库,供所有3个用户使用
  • 客户端库,由客户端和服务器使用
  • 管理库,由服务器和管理客户端使用
  • 服务器库,仅由服务器使用(或将方法直接编译到应用程序中)

  • 通常,您可能不希望在客户端公开管理代码。因为它是一个DLL,所以该代码正等待被利用,因为这些方法必然是公共的。更不用说反编译.NET DLL是件小事,它可能会暴露您的管理员程序的内部工作,而您确实不希望非管理员看到这些工作

    如果要最大限度地减少代码重复,最好的方法(尽管不一定是“最简单的”)是使用3个DLL:

  • 仅包含两个应用程序都使用的函数的公共库
  • 一个只有管理员应用程序才会使用的库(或者,如果没有其他应用程序使用这些函数,则直接将其编译到应用程序中)
  • 只有客户端应用程序才会使用的库(与上面的警告相同)
  • 由服务器、客户端和管理客户端组成的项目可能有3-4个库:

  • 公共库,供所有3个用户使用
  • 客户端库,由客户端和服务器使用
  • 管理库,由服务器和管理客户端使用
  • 服务器库,仅由服务器使用(或将方法直接编译到应用程序中)

  • 您是否考虑过在公共库上使用依赖项注入,即某种形式的构造函数注入,以确定执行期间需要应用的规则

    下面是一个非常简单的示例:

    public interface IWorkerRule
        {
            string FormatText(string input);
        }
    
        internal class AdminRules : IWorkerRule
        {
            public string FormatText(string input)
            {
                return input.Replace("!", "?");
            }
        }
    
        internal class UserRules : IWorkerRule
        {
            public string FormatText(string input)
            {
                return input.Replace("!", ".");
            }
        }
    
        public class Worker
        {
            private IWorkerRule Rule { get; set; }
    
            public Worker(IWorkerRule rule)
            {
                Rule = rule;
            }
    
            public string FormatText(string text)
            {
                //generic shared formatting applied to any consumer
                text = text.Replace("@", "*");
    
                //here we apply the injected logic 
                text = Rule.FormatText(text);
                return text;
            }
        }
    
        class Program
        {       
            //injecting admin functions
            static void Main()
            {
                const string sampleText = "This message is @Important@ please do something about it!";
    
                //inject the admin rules.
                var worker = new Worker(new AdminRules());
                Console.WriteLine(worker.FormatText(sampleText));
    
                //inject the user rules
                worker = new Worker(new UserRules());
                Console.WriteLine(worker.FormatText(sampleText));
    
                Console.ReadLine();
    
            }
    
        }
    
    运行时,您将生成此输出

    这条消息很重要,请做点什么


    此消息非常重要*请采取措施。

    您是否考虑过在公共库上使用依赖项注入,即某种形式的构造函数注入,以确定执行期间需要应用的规则

    下面是一个非常简单的示例:

    public interface IWorkerRule
        {
            string FormatText(string input);
        }
    
        internal class AdminRules : IWorkerRule
        {
            public string FormatText(string input)
            {
                return input.Replace("!", "?");
            }
        }
    
        internal class UserRules : IWorkerRule
        {
            public string FormatText(string input)
            {
                return input.Replace("!", ".");
            }
        }
    
        public class Worker
        {
            private IWorkerRule Rule { get; set; }
    
            public Worker(IWorkerRule rule)
            {
                Rule = rule;
            }
    
            public string FormatText(string text)
            {
                //generic shared formatting applied to any consumer
                text = text.Replace("@", "*");
    
                //here we apply the injected logic 
                text = Rule.FormatText(text);
                return text;
            }
        }
    
        class Program
        {       
            //injecting admin functions
            static void Main()
            {
                const string sampleText = "This message is @Important@ please do something about it!";
    
                //inject the admin rules.
                var worker = new Worker(new AdminRules());
                Console.WriteLine(worker.FormatText(sampleText));
    
                //inject the user rules
                worker = new Worker(new UserRules());
                Console.WriteLine(worker.FormatText(sampleText));
    
                Console.ReadLine();
    
            }
    
        }
    
    运行时,您将生成此输出

    这条消息很重要,请做点什么


    这条信息很重要,请做点什么。

    你为什么觉得这会有好处?瞧,你想解决什么问题…只是有一个较小的物理尺寸?你能详细说明这个问题吗?为什么要有两个DLL?对于管理员或客户端,相同方法的实现是否有所不同?为什么您认为这将是有益的?瞧,你想解决什么问题…只是有一个较小的物理尺寸?你能详细说明这个问题吗?为什么要有两个DLL?对于管理员或客户端,相同方法的实现是否不同?这是我考虑的另一件事。我希望有一个更简单的解决办法,但这似乎是最好的办法。谢谢你的帮助:)那是我考虑的另一件事。我希望有一个更简单的解决办法,但这似乎是最好的办法。感谢您的帮助:)它解决了我写的问题,但通过它,我将管理代码部署到客户身上,就像上面提到的十二面体一样。我以前从未使用过DI,我不确定它是否可以被利用。无论如何,谢谢你的时间+建议;)它rellay解决了我写的问题,但是通过它,我将管理代码部署到客户身上,就像上面提到的十二面体一样。我以前从未使用过DI,我不确定它是否可以被利用。无论如何,谢谢你的时间+建议;)