1

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

  1. 每次都手动复制 DLL 和编辑东西是可怕的。
  2. 也许条件编译对我有帮助,但我不知道如何在三个项目的一个解决方案中使用不同的代码编译 DLL 两次。

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

4

2 回答 2

6

通常,您可能不希望在客户端公开管理代码。由于它是一个 DLL,该代码正等待被利用,因为这些方法必然是公开的。更不用说反编译 .NET DLL 是微不足道的,并且可能会暴露您真的不希望非管理员看到的管理程序的内部工作。

如果你想尽量减少代码重复,最好的,虽然不一定是“最简单”的事情,是拥有 3 个 DLL:

  1. 仅包含两个应用程序都使用的函数的公共库
  2. 只有管​​理员应用程序才会使用的库(或者,如果没有其他人使用这些功能,则直接将其编译到应用程序中)
  3. 只有客户端应用程序将使用的库(与上述相同的警告)

一个由服务器、客户端和管理客户端组成的项目应该有 3-4 个库:

  1. 公共库,所有 3 人都使用
  2. 客户端库,由客户端和服务器使用
  3. 管理库,由服务器和管理客户端使用
  4. 服务器库,仅由服务器使用(或者直接将方法编译到应用程序中)
于 2013-11-05T19:31:17.410 回答
1

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

这是一个非常简单的例子:

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();

        }

    }

运行时,您将产生此输出。

这条消息*重要*请做点什么?

这条消息*重要*请做点什么。

于 2013-11-05T20:03:19.630 回答