一个DLL,具有两个应用程序的两个实现

时间:2013-11-05 19:25:07

标签: c# dll

我有一些带有一些类和方法的DLL。还有两个应用程序使用它。 一个管理应用程序几乎需要每个方法,而客户端应用程序只需要部分内容。但是它们的大部分都被它们使用。现在我想用管理员的东西和一个与客户端的东西制作一个DLL。

  1. 每次复制DLL并手动编辑都很可怕。
  2. 也许条件编译可以帮助我,但我不知道如何使用三个项目在一个解决方案中使用不同的编码两次编译DLL。
  3. 对于这个问题,是否有比使用两个不同的DLL并在每次更改时手动编辑更好的方法?

2 个答案:

答案 0 :(得分:6)

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

最好的,但不一定是“最简单”的事情,如果你想最小化代码重复,就是有3个DLL:

  1. 包含仅两个应用程序使用的功能的公共库
  2. 只有管理员应用程序才会使用的库(如果没有其他任何东西可以使用这些函数,则直接将其编译到应用程序中)
  3. 仅供客户端应用程序使用的库(与上述相同的警告)
  4. 由服务器,客户端和管理客户端组成的项目应该有3-4个库:

    1. 所有3
    2. 使用的公共库
    3. 客户端库,由客户端和服务器使用
    4. 管理员库,由服务器和管理员客户端使用
    5. 服务器库,仅供服务器使用(或者直接将方法编译到应用程序中)

答案 1 :(得分: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();

        }

    }

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

此消息为*重要*请为此做些什么?

此消息为*重要*请为此做点什么。