这是设置.假设我有一些需要服务实例的动作过滤器:
public interface IMyService
{
void DoSomething();
}
public class MyService : IMyService
{
public void DoSomething(){}
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个需要该服务实例的ActionFilter:
public class MyActionFilter : ActionFilterAttribute
{
private IMyService _myService; // <--- How do we get this injected
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
_myService.DoSomething();
base.OnActionExecuting(filterContext);
}
}
Run Code Online (Sandbox Code Playgroud)
在MVC 1/2中,将依赖关系注入动作过滤器是一个痛苦的屁股.最常见的方法是使用自定义操作调用因为在这里可以看到:http://www.jeremyskinner.co.uk/2008/11/08/dependency-injection-with-aspnet-mvc-action-filters/的这种解决方法背后的主要动机是因为以下方法被认为是与容器的草率和紧密耦合:
public class MyActionFilter : ActionFilterAttribute
{
private IMyService _myService;
public MyActionFilter()
:this(MyStaticKernel.Get<IMyService>()) //using Ninject, but would apply to any container
{
}
public MyActionFilter(IMyService myService)
{
_myService = myService;
} …Run Code Online (Sandbox Code Playgroud) c# asp.net-mvc dependency-injection actionfilterattribute asp.net-mvc-3
可能重复:
单身人士有什么不好的?
我最近听说过Singleton是一种反模式.我知道它与事实有关,使得一个类单例就像使该唯一实例成为一个全局变量,但它也做了很多(限制该对象的实例数,管理实例化等等).
为什么Singleton被认为是反模式?还有什么选择?
我最近读到,制作类单例使得无法模拟类的对象,这使得测试其客户端变得困难.我无法立即理解其根本原因.有人可以解释为什么不可能嘲笑单身人士课程?此外,还有更多的问题与制作班级单身人士有关吗?
可能重复:
单身人士有什么不好的?
可以理解的是,许多设计模式在某些情况下可能被滥用,就像妈妈总是说:" 太多好事并不总是好的! "
我注意到这些天,我经常使用Singletons,而且我担心自己可能会滥用设计模式,并且越来越深入地研究一种不良习惯的习惯.
我们正在开发一个Flex应用程序,当用户使用它时,该应用程序在内存中保留了相当大的分层数据结构.用户可以按需加载,保存,更改和刷新数据.
这些数据通过Singleton类集中,该类聚合了几个ArrayCollections,Arrays,value对象以及通过getter和setter公开的一些其他本机成员变量.
要从应用程序的任何位置获取对数据的引用,我们执行整个Model.getInstance()方法类型的事情,我确信每个人都熟悉.这确保了我们始终掌握相同的数据副本,因为在我们设计时,我们说在应用程序生命周期中只允许存在一次实例.
从这个中央数据存储库中,我们可以轻松地调度属性更改事件,并且可以有多个引用中央数据的UI组件,更新其显示以反映已发生的数据更改.
到目前为止,这种方法已经有效并且证明对我们的环境非常实用.
然而,我发现,在创建新课程时,我有点过分了.问题应该是一个类是Singleton,还是应该以其他方式管理,例如可能使用工厂,往往有点变得有点困难,有点不确定.
我在哪里画单线?是否有一个很好的指导方针来决定何时使用单身人士以及何时远离他们.
另外,有人可以推荐一本关于设计模式的好书吗?
在过去的几天里,我有一种感觉,依赖注入应该被称为"我无法下定决心" - 模式.我知道这可能听起来很愚蠢,但实际上这是为什么我应该使用依赖注入(DI)的原因.通常据说我应该使用DI来实现更高水平的松散耦合,并且我得到了那个部分.但实际上......一旦我的选择落在MS SQL或MySQL上,我多久更换一次数据库.很少这么做对吗?
有没有人有一些非常令人信服的理由为什么DI是要走的路?
当人们使用Monostate模式而不是singleton来维护全局对象时,会出现什么情况?
编辑:我知道Singleton和Monostate模式是什么.在很多场景中也实现了Singleton.只想知道需要实现MonoState模式的场景(案例).
例如.我需要在我的Windows窗体应用程序中维护每个屏幕的列列表.在这种情况下,我可以使用Singleton Dictionary.但是,我在静态全局var中存储了一个List,我想提供索引器(因为我需要动态地将新条目添加到列表中,如果key不存在),我可以将ScreenDetails.ScreenName指定为键并获取ScreenDetails .ColumnsTable.由于索引器无法在静态类上操作,因此我将模式更改为Monostate.
所以我想知道哪些其他场景可能迫使用户使用Monostate而不是Singletons.
我有一个应用程序,我有一个名为的类PlausibilityChecker.这个类只有静态方法,比如checkZipcodeFormat或checkMailFormat.我在GUI类中使用它们来检查输入,然后再将它发送到较低层.
这是好习惯吗?我以为我只使用静态方法,所以我不必关心将实例传递给GUI类或者在每个gui类中都有一个不引用gui对象的实例字段.
我注意到这个Files类Java NIO只有静态方法所以我认为这不是那么可怕的错误.
我碰巧发表了一篇文章,最近讨论了Java中的双重检查锁定模式及其陷阱,现在我想知道我多年来一直使用的那种模式的变体是否会受到任何问题的影响.
我已经查看了很多关于这个主题的帖子和文章,并了解了获取对部分构造对象的引用的潜在问题,据我所知,我认为我的实现不受这些问题的影响.以下模式是否有任何问题?
而且,如果没有,为什么人们不使用它?我在这个问题的任何讨论中都没有看过它.
public class Test {
private static Test instance;
private static boolean initialized = false;
public static Test getInstance() {
if (!initialized) {
synchronized (Test.class) {
if (!initialized) {
instance = new Test();
initialized = true;
}
}
}
return instance;
}
}
Run Code Online (Sandbox Code Playgroud) java singleton multithreading synchronization double-checked-locking
我想在我的Python程序中实现某种单例模式.我想在不使用课程的情况下这样做; 也就是说,我想将所有与单例相关的函数和变量放在一个模块中,并将其视为一个实际的单例.
例如,假设这是在'singleton_module.py'文件中:
# singleton_module.py
# Singleton-related variables
foo = 'blah'
bar = 'stuff'
# Functions that process the above variables
def work(some_parameter):
global foo, bar
if some_parameter:
bar = ...
else:
foo = ...
Run Code Online (Sandbox Code Playgroud)
然后,程序的其余部分(即其他模块)将使用此单例,如下所示:
# another_module.py
import singleton_module
# process the singleton variables,
# which changes them across the entire program
singleton_module.work(...)
# freely access the singleton variables
# (at least for reading)
print singleton_module.foo
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎是个好主意,因为它在使用单例的模块中看起来很干净.
然而,单身模块中所有这些繁琐的"全局"陈述都是丑陋的.它们出现在处理单例相关变量的每个函数中.在这个特定的例子中,这并不多,但是当你有10个以上的变量来管理多个函数时,它并不漂亮.
此外,如果您忘记了全局语句,这很容易出错:将创建函数本地的变量,并且不会更改模块的变量,这不是您想要的!
那么,这会被认为是干净的吗?是否有类似于我的方法可以消除"全球"混乱?
或者这根本不是要走的路?
我已经基于c ++ 11实现了单例。但是在某些情况下,可以多次调用构造函数。
该类将编译为静态lib,并由其他so lib(一个以上so lib)使用。并且该系统是多线程系统(在Android HAL级别运行)
/// .h文件:
class Logger
{
public:
/// Return the singleton instance of Logger
static Logger& GetInstance() {
static Logger s_loggerSingleton;
return s_loggerSingleton;
}
private:
/// Constructor
Logger();
/// Destructor
~Logger();
}
Run Code Online (Sandbox Code Playgroud)
/// .cpp文件
Logger::Logger()
{
ALOGE("OfflineLogger create");
}
Logger::~Logger()
{
}
Run Code Online (Sandbox Code Playgroud)
应该创建一次,例如:
03-21 01:52:20.785 728 4522 E : OfflineLogger create
Run Code Online (Sandbox Code Playgroud)
但是我可以看到它已经创建了不止一次
03-21 01:52:20.785 728 4522 E : OfflineLogger create
03-21 01:52:20.863 728 2274 E : OfflineLogger create
03-21 01:52:20.977 728 2273 E : …Run Code Online (Sandbox Code Playgroud)