我有一个使用MVC构建的零售WebSite。调用REST WebAPI服务以提供基本的CRUD操作。我想创建一个共享DLL,我可以在网站和API之间引用。该DLL将包含模型(与我的数据库表结构匹配)和执行基本CRUD操作的代码。这样我就不必在WebAPI中引用我的数据库代码了。我可以做得很好。我的问题是,无论如何都要隐藏零售网站上的方法,同时仍然让它们对API可见?
我目前正在做什么(哪些不起作用)是在WebSite中创建一个继承自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中,我可以直接调用函数RetrieveAccountId:
Account account = new Account();
account.RetrieveAccountId();
问题是,我在技术上也可以通过WebSite中的mmAccount(从Account中派生)来实现。无论如何,我只能从WebSite中隐藏该方法吗?
答案 0 :(得分:1)
你可以标记方法$output = shell_exec("/usr/bin/ffmpeg -i in.mp3 -b:a 96k out.mp3");
echo $output;
并使用internalsVisibleTo Attribute
虽然感觉有点笨拙。我个人之间有一个服务层 - 网站永远不会直接看到数据库模型;它只接收由某种形式的服务填充的DTO对象。通过这种方式,如果您的底层数据库结构发生变化,网站并不关心,并且永远不需要知道基础数据库的内容是什么'一个实体是......
答案 1 :(得分:0)
这取决于 - 如果你想有选择地允许这种继承,你可能希望使用接口和管理器或工厂将实例提供给WebAPI版本,接口不允许你不使用的功能想。
如果您不需要在其他位置继承.RetreiveAccountId()
函数,则可以将其设置为internal
或(使用C#7.2)private protected
。内部将允许同一程序集中的其他类使用该方法,而private protected将允许同一程序集中的派生类(但不是不同程序集中的派生类)使用该函数。
答案 2 :(得分:0)
要隐藏子类中的方法,您必须使用new关键字在子类中重新定义它的功能。
public class mmAccount : Account {
public new int RetrieveAccountId {
throw new WhatDoYouThinkYouAreDoingException("You are not allowed!");
}
}
对mmAccount.RetrieveAccountId()的任何调用都将通过此新方法进行路由。 这样做的缺点是以下仍然会给出原始回报:
mmAccount mAcc = new mmAccount();
Account acc = mAcc as Account;
int id = acc.RetrieveAccountId();
要真正解决这个问题,您必须更改有关父类的内容(例如,使用虚拟方法并覆盖它)