Как вы предотвращаете прямой доступ к ссылочной программе? (.СЕТЬ) - PullRequest
0 голосов
/ 20 июня 2019

Скорее всего, я не правильно описал свой заголовок, и мне совершенно не хватает терминологии для того, что я пытаюсь сделать ... так что, если вы читаете это и знаете, что я должен просить ... поделитесь.

Так вот моя проблема.Я создаю DLL.Эта DLL, конечно, будет иметь несколько классов внутри.Вызывающему решению потребуется доступ к этим классам и их различным методам.

Однако я хочу заставить вызывающую программу создавать только экземпляр класса "Parent \ Root", потому что мне требуется определенная информация в любое время, когда онисобираюсь использовать все, что является частью этого класса (думаю, что-то вроде лицензионного ключа, но не совсем).

Итак, с точки зрения клиента .. Я хочу, чтобы это работало так ...

FooDll.Client myFooClient = new FooDLL.Client(myLicensesKey)

myFooClient.Store.PlaceOrder()
myFooClient.Shop.FixWidget()

Теперь, с моей стороны DLL, я думал что-то вроде этого ...

public class Client
{
   public StoreLogic Store {get;}  //This is a internal Class that contains the method PlaceHolder
   public ShopLogic Shop {get;}    //This is an internal Class that contains the method FixWidget

   public Client(string LicenseKey)
   {
     set some internal global flags for the entire library
   }
 }

Теперь я могу сделать это сейчас, пока я объявляю классы StoreLogic и ShopLogic как "Public".но если я сделаю это, клиент теперь может сделать это ...

FooDll.StoreLogic myStore = new FooDLL.StoreLogic()

Что я не хочу.

1 Ответ

3 голосов
/ 20 июня 2019

Просто пометьте конструкторы StoreLogic и ShopLogic как internal.
При этом их может создавать только класс, содержащийся в той же сборке, например, класс Client.

public class StoreLogic
{
    internal StoreLogic()
    {}

    public void PlaceOrder() {}
}

public class ShopLogic
{
    internal ShopLogic() 
    {}

    public void FixWidget() { }
}

public class Client
{
    public StoreLogic Store { get; }
    public ShopLogic Shop { get; }

    public Client(string LicenseKey)
    {
        this.Shop = new ShopLogic();
        this.Store = new StoreLogic();
    }
}
...