Есть ли способ ограничить доступ к общедоступному методу только конкретным классом в C #? - PullRequest
7 голосов
/ 13 апреля 2010

У меня есть класс A с открытым методом в C #. Я хочу разрешить доступ к этому методу только для класса B. Возможно ли это?

UPDATE

Вот что я хотел бы сделать:

public class Category
{
    public int NumberOfInactiveProducts {get;}
    public IList<Product> Products {get;set;}

    public void ProcessInactiveProduct()
    {
        // do things...

        NumberOfInactiveProducts++;
    }
}

public class Product
{
    public bool Inactive {get;}
    public Category Category {get;set;}

    public void SetInactive()
    {
        this.Inactive= true;
        Category.ProcessInactiveProduct();
    }
}

Я бы хотел, чтобы другие программисты сделали:

var prod = Repository.Get<Product>(id);
prod.SetInactive();

Я бы хотел убедиться, что они не вызывают ProcessInactiveProduct вручную:

var prod = Repository.Get<Product>(id);
prod.SetInactive();
prod.Category.ProcessInactiveProduct();

Я хочу разрешить доступ Category.ProcessInactiveProduct только к классу Product. Другие классы не должны вызывать Category.ProcessInactiveProduct.

Ответы [ 5 ]

18 голосов
/ 13 апреля 2010

Поместите оба класса в отдельную сборку и сделайте метод внутренним.

2 голосов
/ 13 апреля 2010

Вы можете сделать класс A закрытым вложенным классом внутри класса B:

class B
{
    class A
    {
        public Int32 Foo { get; set; }
    }
}

Только B сможет видеть A и его участников в этом примере.

В качестве альтернативы вы можете вложить B внутрь A:

class A
{
    Int32 Foo { get; set; }

    public class B { }
}

В этом случае каждый может видеть и A, и B, но только B может видеть A.Foo.

1 голос
/ 04 апреля 2013

Вы можете ограничить доступ к методу / классу следующим образом:

[StrongNameIdentityPermissionAttribute(SecurityAction.Demand, PublicKey="…hex…", Name="App1", Version="0.0.0.0")]
public class Class1 { } 

Посмотрите здесь http://msdn.microsoft.com/en-us/library/c09d4x9t.aspx для получения дополнительной информации.

Управляемый код предлагает несколько способов ограничения метода доступа :
...

  • Ограничить доступ метода для вызывающих абонентов с указанным идентификатором - по существу, любое конкретное свидетельство (строгое имя, издатель, зона и т. Д.), Которое вы выберете.
0 голосов
/ 13 апреля 2010

Вы можете использовать шаблон типа Observer, где Категория регистрирует интерес к определенным событиям в Продукте (возможно, событие ProductInactivation?), А затем обрабатывает логику соответствующим образом. Этот шаблон, основанный на событиях, очень распространен и значительно снижает связь. Категория в конечном итоге несет ответственность за свое собственное состояние и не полагается на то, что Продукт знает что-то о том, что в нем содержится, чтобы сохранить состояние категории в целости и сохранности. Продукт просто сообщает заинтересованным клиентам, когда с ним что-то произошло.

Другим вариантом является рефакторинг вашего класса Category так, чтобы он содержал или содержался в каком-либо объекте CategoryProductServices, который инкапсулирует методы, которые Продукт должен будет выполнить в своей содержащей Категории. В контексте, который создает Категории и Продукты, передайте экземпляр этого объекта CategoryProductServices в Продукт, а не в полную Категорию. Этот дизайн делает интерфейс общедоступным, но не позволяет вашему клиенту получить доступ к сервисам, поскольку они не могут получить экземпляр. Это также ослабляет тесную связь Продуктов с классом Категории, ограничивая его только теми услугами, о которых Продукты должны знать. Это оставляет Продукт ответственным за состояние, но по крайней мере ограничивает то, что ему нужно знать / делать.

0 голосов
/ 13 апреля 2010

На ваш вопрос нет готового ответа.

Если они уже находятся в одной сборке, почему бы не сделать метод внутренней областью видимости?

Если они находятся в разных сборках, вы можете использовать синтаксис " friend ", который охватывает все внутренние методы.

Вероятно, ваше лучшее решение - ограничить доступ к общедоступным методам для определенных сборок. Это означает, что кто-то не может просто написать новую сборку и продолжить вызов ваших открытых методов. Учитывая, что у вас, похоже, есть модель предметной области, похоже, что вы должны разрешить вызов этого метода из других объектов предметной области, но, возможно, не из бизнес-логики. Это может быть достигнуто путем назначения уникального строгого имени для DLL модели домена.

Вы можете ограничить доступ к общедоступному методу, чтобы он мог вызываться только методами в сборках, удовлетворяющих заданному общедоступному ключу. см. msdn StrongNameIdentityPermission

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...