簡體   English   中英

一個DLL具有兩個應用程序的兩個實現

[英]One DLL with two implementations for two applications

我有一些類和方法的DLL。 和兩個使用它的應用程序。 一個需要幾乎所有方法的管理應用程序和僅需要部分內容的客戶端應用程序。 但是它們中的很大一部分都被他們兩個使用。 現在,我想用管理員的東西制作一個DLL,用客戶端的東西制作一個DLL。

  1. 每次都復制DLL並手動編輯內容是可怕的。
  2. 也許條件編譯對我有幫助,但是我不知道如何在三個項目的一個解決方案中用不同的條件對DLL進行兩次編譯。

是否有比擁有兩個不同的DLL和對每個更改進行手動編輯更好的方法?

通常,您可能不希望在客戶端公開管理代碼。 由於它是一個DLL,因此該代碼正等着被利用,因為這些方法必然是公開的。 更不用說反編譯.NET DLL是微不足道的,並且可能會暴露您不希望非管理員查看的管理程序的內部工作。

如果要最大程度地減少代碼重復,最好的方法(雖然不一定是“最簡單的”事情)是具有3個DLL:

  1. 一個公共庫,僅包含兩個應用程序都使用的函數
  2. 一個僅由管理應用程序使用的庫(或者,如果根本沒有其他函數使用這些功能,則將其直接編譯到應用程序中)
  3. 僅客戶端應用程序將使用的庫(與上述相同)

由服務器,客戶端和管理客戶端組成的項目可能應具有3-4個庫:

  1. 公用庫,所有3個都使用
  2. 客戶端庫,由客戶端和服務器使用
  3. 管理庫,服務器和管理客戶端使用
  4. 服務器庫,僅由服務器使用(或直接將方法編譯到應用程序中)

您是否考慮過在公共庫上使用依賴項注入(某種形式的構造函數注入)來確定在執行過程中需要應用的規則。

這是一個非常簡單的示例:

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

        }

    }

運行時,您將產生此輸出。

此消息是*重要*,請對此做點什么?

此消息很重要,請對此做些事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM