我在C#中有一个带有公共方法的A类。我想允许只允许访问此方法B.这可能吗?
更新:
这就是我想做的事情:
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。
答案 0 :(得分:18)
将两个类放在一个单独的程序集中,并使该方法处于内部。
答案 1 :(得分:2)
如果您将类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
。
答案 2 :(得分:1)
您可以通过以下方式限制方法/类访问:
[StrongNameIdentityPermissionAttribute(SecurityAction.Demand, PublicKey="…hex…", Name="App1", Version="0.0.0.0")]
public class Class1 { }
请点击此处http://msdn.microsoft.com/en-us/library/c09d4x9t.aspx了解详情。
托管代码提供了多种限制方法访问的方法:
...
- 限制对指定身份的呼叫者的方法访问权限 - 实质上是您选择的任何特定证据(强名称,发布者,区域等)。
答案 3 :(得分:0)
您的问题没有开箱即用的答案。
如果它们已经在同一个程序集中,为什么不将该方法改为内部作用域?
如果它们位于不同的程序集中,您可以使用涵盖所有内部方法的“friend”语法。
可能您最好的解决方案是将公共方法的访问权限限制为特定程序集。这意味着有人不能只编写一个新程序集并继续调用您的公共方法。鉴于您似乎有一个域模型,看起来您应该允许从其他域对象调用此方法,但可能不是从业务逻辑调用。这可以通过为域模型DLL分配唯一的强名称来实现。
您可以限制对公共方法的访问,以仅允许由满足给定公钥的程序集中的方法调用它。见msdn StrongNameIdentityPermission
答案 4 :(得分:0)
您可以使用Observer类型的模式,其中Category注册对Product上的特定事件(可能是ProductInactivated事件?)的兴趣,然后适当地处理逻辑。这种基于事件的模式非常常见,大大减少了耦合。类别最终对其自身状态负责,并且不依赖于产品知道包含它的内容,以保持类别的状态不变。产品只是告诉感兴趣的客户什么时候发生了事情。
另一种选择是重构您的Category类,使其包含或包含在某个CategoryProductServices对象中,该对象封装了Product在其包含的Category上需要执行的方法。在创建类别和产品的上下文中,将此CategoryProductServices对象的实例传递给Product而不是完整的Category。此设计使接口保持公用,但阻止客户端访问服务,因为它们无法检索实例。它还放松了Products与Category类的紧密耦合,将其限制为只有产品必须知道的那些服务。这使得产品负责该州,但至少限制了它需要知道/做的事情。