c#继承仅从一个派生类隐藏方法

c#继承仅从一个派生类隐藏方法,c#,inheritance,hide,C#,Inheritance,Hide,我有一个用MVC构建的零售网站。调用REST WebAPI服务以提供基本CRUD操作。我想创建一个共享DLL,我可以在网站和API之间引用。该DLL将包含模型(与我的DB表结构相匹配)和执行基本CRUD操作的代码。这样我就不必在WebAPI中引用我的数据库代码了。我可以做得很好。我的问题是,是否有任何方法可以对零售网站隐藏这些方法,同时仍然使它们对API可见 我目前正在做的(不起作用)是在网站中创建一个从DLL中的类继承的类。这将从DLL中获取模型,但从技术上讲,它也允许我调用方法与数据库交互

我有一个用MVC构建的零售网站。调用REST WebAPI服务以提供基本CRUD操作。我想创建一个共享DLL,我可以在网站和API之间引用。该DLL将包含模型(与我的DB表结构相匹配)和执行基本CRUD操作的代码。这样我就不必在WebAPI中引用我的数据库代码了。我可以做得很好。我的问题是,是否有任何方法可以对零售网站隐藏这些方法,同时仍然使它们对API可见

我目前正在做的(不起作用)是在网站中创建一个从DLL中的类继承的类。这将从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”是什么