在基于Rob Conery的MVC Storefront的多租户ASP.NET MVC应用程序中,我应该在存储库或服务层中过滤租户的数据吗?
public interface IJobRepository
{
IQueryable<Job> GetJobs(short tenantId);
}
Run Code Online (Sandbox Code Playgroud)
public interface IJobService
{
IList<Job> GetJobs(short tenantId);
}
Run Code Online (Sandbox Code Playgroud)
我的直觉是在服务层(选项2)中做到这一点,但可以说每个租户本质上应该有自己的"虚拟存储库"(选项1),其中这个责任在于存储库.
我尝试了在存储库中提出过滤的提议,但问题是我的应用程序提供了租户上下文(通过子域)并且只与服务层交互.将上下文一直传递到存储库层是一项任务.
所以我选择在服务层过滤我的数据.我觉得存储库应该代表存储库中物理上可用的所有数据,并使用适当的过滤器来检索服务层使用的特定于租户的数据.
由于不必要的复杂性,我最终放弃了这种方法.请参阅下面的答案.
我想知道Handler在Yesod中为用户/权限或资源添加角色的最佳方法是什么.有没有人有这种东西的先前艺术?是否有任何方法利用类型系统来帮助防止漏洞(并且还要保持数据库查询以检查所有权等)?
编辑:很抱歉错过了这个 - 我确实注意到实际上有一个部分,我乍一看(我认为因为没有提及访问/角色/权限),在Yesod书中的授权.这似乎在路由器级别使用PUT/POST的写标志进行访问控制.它本身看起来并不十分复杂,但它看起来很适合在顶部构建抽象...
我有一个在文件中定义的私有协议,如下所示
private protocol testProtocol {
func testFunc1()
func testFunc2()
}
Run Code Online (Sandbox Code Playgroud)
公共类符合上述协议如下
public class testClass : testProtocol {
func testFunc1() {}
func testFunc2() {}
}
Run Code Online (Sandbox Code Playgroud)
根据apples文档,默认情况下,公共类的成员获得内部访问控制,除非它明确设置为不同的访问控制修饰符.
该文档还说,类型与具有较低访问控制的协议的一致性将使该类型的协议访问控制的实现与协议的实现相同.在这种情况下,由于类型的访问控制是公共的,并且协议访问控制是私有的,因此方法testfunc1和testfunc2应该获得私有的访问控制.
当在不同的源文件中实例化类并且如下所示访问方法时,编译器不会显示不期望的错误,因为根据指南,方法应该是私有的
var test: testClass = testClass()
test.testFunc1()
Run Code Online (Sandbox Code Playgroud)
这是预期的行为吗?我错过了什么吗?
Swift编程语言有关于扩展的访问控制的说法:
您可以在类,结构或枚举可用的任何访问上下文中扩展类,结构或枚举.扩展中添加的任何类型成员具有与要扩展的原始类型中声明的类型成员相同的默认访问级别.如果扩展公共或内部类型,则添加的任何新类型成员都将具有内部的默认访问级别.如果扩展私有类型,则添加的任何新类型成员都将具有私有的默认访问级别.
或者,您可以使用显式访问级别修饰符(例如,专用扩展名)标记扩展,以为扩展中定义的所有成员设置新的默认访问级别.仍可以在单个类型成员的扩展中覆盖此新默认值.
我不完全理解上述说法.是说以下内容:
public struct Test { }
extension Test {
// 1. This will be default to internal because Test is public?
var prop: String { return "" }
}
public extension Test {
// 2. This will have access level of public because extension is marked public?
var prop2: String { return "" }
extension Test {
// 3. Is this the same as the above public extension example?
public var prop2: String { return "" } …Run Code Online (Sandbox Code Playgroud) 在Swift 4中,由于现在private在同一源代码文件中也可以看到扩展,它与fileprivate访问修饰符有什么不同?
背景:在Swift 3中,类中的私有变量在同一文件的扩展中不可见.为此,fileprivate必须使用.
我正在尝试从几个域进行AJAX调用到一个将处理请求的域.通过在处理服务器上设置标头,可以轻松在Firefox和Chrome中启用跨域:
header("Access-Control-Allow-Origin: *");
Run Code Online (Sandbox Code Playgroud)
但这无助于在Internet Explorer中启用它.当我尝试:
httpreq.send('');
Run Code Online (Sandbox Code Playgroud)
它会因错误访问被拒绝而停止.
如何在Internet Explorer中启用它?
我是初学者级别的面向对象编程爱好者.我遇到了以下谜题:
class A {
};
class B {
protected:
friend class A;
};
class C {
public:
friend class B;
};
Run Code Online (Sandbox Code Playgroud)
参考上面的示例代码,假设上面的类有数据成员,可以在A成员的声明中使用C成员的名称?
只有私人会员
只受保护的成员
所有C的数据成员
只有公众成员
C的数据成员中没有一个*
我的选择是回答4,因为友谊不是传递性的.因此,A是B的朋友,但A不是C的朋友(即使B是C的朋友).这是正确的想法吗?
另外,我的问题是到目前为止(在教程中)我遇到过exmaples,其中友谊声明如下:
class X {
public:
friend class Y;
};
Run Code Online (Sandbox Code Playgroud)
如果我们使用受保护的那个而不是公共说明符,有什么区别?像那样:
class X {
protected:
friend class Y;
};
Run Code Online (Sandbox Code Playgroud) 我最近遇到了一段c ++代码,其中一个类与自己成为朋友.正如我在不同论坛上所读到的,一个班级已经是他自己的朋友.所以我想知道是否有一个特定的原因,为什么人们想要明确地让自己成为一个阶级朋友.
另一个问题是,让一个班级成为自己的朋友的原因是什么?
也许有经验的人可以澄清这个话题.
这是代码示例,用于说明我的问题:
template < typename T>
class Foo: public T
{
protected:
template < typename U>
friend class Foo;
}
Run Code Online (Sandbox Code Playgroud) 嗨,我有一个自定义需求处理程序,接受AuthorizationHandlerContext context参数
当我调试时,我可以看到上下文对象包含Context.Resources.ActionDescription.ActionName
但是在编写代码时我不能超越Context.Resources
似乎较低的水平没有暴露.我想获取调用处理程序的操作名称和控制器名称.我该怎么做呢?
我有一个由 html/css/javascript 文件组成的静态网站。该网站是自动生成的,并且经常更新。
我不想使用用户名/密码(基本身份验证)授权访问网站,而是希望用户使用 Google 登录/openID Connect 进行身份验证,然后通过 gmail 地址白名单控制访问。
设置它的最简单方法是什么?
access-control ×10
asp.net-mvc ×2
c++ ×2
friend ×2
swift ×2
asp.net ×1
asp.net-core ×1
class ×1
cross-domain ×1
haskell ×1
inheritance ×1
ios ×1
javascript ×1
multi-tenant ×1
protocols ×1
rbac ×1
swift2 ×1
swift4 ×1
yesod ×1