c#继承仅从一个派生类隐藏方法
我有一个用MVC构建的零售网站。调用REST WebAPI服务以提供基本CRUD操作。我想创建一个共享DLL,我可以在网站和API之间引用。该DLL将包含模型(与我的DB表结构相匹配)和执行基本CRUD操作的代码。这样我就不必在WebAPI中引用我的数据库代码了。我可以做得很好。我的问题是,是否有任何方法可以对零售网站隐藏这些方法,同时仍然使它们对API可见 我目前正在做的(不起作用)是在网站中创建一个从DLL中的类继承的类。这将从DLL中获取模型,但从技术上讲,它也允许我调用方法与数据库交互 下面是一个例子: 在DLL中c#继承仅从一个派生类隐藏方法,c#,inheritance,hide,C#,Inheritance,Hide,我有一个用MVC构建的零售网站。调用REST WebAPI服务以提供基本CRUD操作。我想创建一个共享DLL,我可以在网站和API之间引用。该DLL将包含模型(与我的DB表结构相匹配)和执行基本CRUD操作的代码。这样我就不必在WebAPI中引用我的数据库代码了。我可以做得很好。我的问题是,是否有任何方法可以对零售网站隐藏这些方法,同时仍然使它们对API可见 我目前正在做的(不起作用)是在网站中创建一个从DLL中的类继承的类。这将从DLL中获取模型,但从技术上讲,它也允许我调用方法与数据库交互
public class Account {
public int AccountId { get; set; }
}
public int RetrieveAccountId {
// Hit the database to retrieve the current account id...
}
在零售MVC网站上
public class mmAccount : Account {
}
现在,在零售mvc站点中,我可以说mmAccount.AccountId
在Web API中,我可以直接调用函数RetrieveAccount,如下所示:
Account account = new Account();
account.RetrieveAccountId();
问题是,我也可以通过网站上的mmAccount(源自Account)技术上做到这一点。是否我只能在网站上隐藏该方法?这取决于-如果您希望有选择地允许此继承,您可能希望使用接口和管理器或工厂为WebAPI版本提供实例,接口不允许您不想要的功能。
如果不需要在其他地方继承
.retreiveAccount()
函数,可以将其设置为内部
或(使用C#7.2)私有保护
。Internal将允许同一程序集中的其他类使用该方法,private protected将允许同一程序集中的派生类(而不是不同程序集中的派生类)使用该函数。要隐藏子类中的方法,必须使用new关键字在子类中重新定义其功能
public class mmAccount : Account {
public new int RetrieveAccountId {
throw new WhatDoYouThinkYouAreDoingException("You are not allowed!");
}
}
对mmAccount.RetrieveAccount()的任何调用都将通过此新方法路由。
这样做的缺点是,以下情况仍将提供原始回报:
mmAccount mAcc = new mmAccount();
Account acc = mAcc as Account;
int id = acc.RetrieveAccountId();
要真正解决这个问题,您还必须更改父类的某些内容(例如使用虚拟方法并重写它)您可以标记方法内部
并使用
虽然感觉有点不舒服。就我个人而言,我有一个中间的服务层-网站从来没有直接看到数据库模型;它只接收由某种形式的服务填充的DTO对象。这样,网站就不在乎底层数据库结构是否发生变化,也不需要知道实体的底层“ID”是什么