这是我想要的DI容器:
public class Class
{
public Class(IDependency dependency, string data) { }
}
var obj = di.Resolve<Class>(() => new Class(null, "test"));
Run Code Online (Sandbox Code Playgroud)
兴趣点:
另一个主要要求是我希望自动拾取我的组件,即我不想注册类 - 我希望IoC能够选择它,因为它知道如何解决IDependency.
此外,Property Injection有时也很有用,但这是可选的.
问题实际上是关于功能的组合 - 拥有所有功能 - 类型安全,参数,自动拾取......很容易检查一个功能,但除非一个人熟悉,否则它们的组合不容易验证特定容器并了解其功能.这样的问题.
这是代码:
public interface IValidator<T>
{
bool IsValid(T obj);
}
public class OrderValidator: IValidator<Order>
{
// ...
}
public class BaseEntity
{
}
public class Order: BaseEntity
{
}
Run Code Online (Sandbox Code Playgroud)
问题是我做不到:
var validator = new OrderValidator();
// this line throws because type can't be converted
var baseValidator = (IValidator<BaseEntity>)validator;
// all this is because I need a list with IValidator<Order>, IValidator<BaseOrder>, etc.
IList<IValidator<BaseEntity>> allValidators = ...
Run Code Online (Sandbox Code Playgroud)
如何获取并存储基础T的所有IValidator <T>实现的列表 - 比如BaseEntity?目前我做的是非通用的IValidator,接受"对象obj",但它不好,不是类型安全的.
有趣的是C#允许编译:
var test = (IValidator<BaseEntity>)new OrderValidator();
Run Code Online (Sandbox Code Playgroud)
但在运行时失败了
Unable to cast …Run Code Online (Sandbox Code Playgroud) 我希望模板根据某些条件从两种类型中进行选择.例如
struct Base {};
template <typename T1, typename T2>
struct test
{
// e.g. here it should select T1/T2 that is_base_of<Base>
typename select_base<T1, T2>::type m_ValueOfBaseType;
};
Run Code Online (Sandbox Code Playgroud)
当然,将条件传递给select_base(使其通用)会很有用,但硬编码的解决方案也更容易和更好.
这是我尝试过的示例解决方案,但总是选择T1:http://ideone.com/EnVT8
问题是如何实现select_base模板.
c++ templates metaprogramming type-traits template-meta-programming
我有一个dlopen()用于加载其他模块的应用程序.应用程序和模块使用gcc 4.6构建在Ubuntu 12.04 x86_64上,但是用于i386 arch.然后将二进制文件复制到具有完全相同操作系统的另一台计算机并正常工作.
但是,如果将它们复制到Ubuntu 12.04 i386,则某些(但不是全部)模块无法加载以下消息:
dlopen: cannot load any more object with static TLS
Run Code Online (Sandbox Code Playgroud)
我怀疑这是由__thread变量的使用引起的.但是,这些变量不会在加载的模块中使用 - 仅在加载器模块本身中使用.
有人可以提供任何其他信息,可能是什么原因?
我正在减少__thread变量的数量并优化它们(-ftls-model等等),我只是好奇为什么它不能在几乎相同的系统上工作.
这里的答案表明,静态初始化后不调用__attribute __((构造函数)),它在声明顺序中调用.
那么,如果在初始化所有数据时不能保证调用它的目的是什么呢?我们也可以在Foo构造函数中使用我们的((构造函数)代码.
我正在寻找的是一种在共享库中拥有一个代码的方法,该代码将在初始化所有静态数据并调用静态构造函数之后执行.我看到人们推荐__attribute __((构造函数))作为DllMain的替代品; 我们可以看到这是错误的,因为某些静态数据可能仍未初始化.
当然在单个文件(编译单元)中我们可以安排静态.但在典型的程序中有很多文件.在初始化共享库中的所有其他静态之后,有没有办法保证一个文件中的((构造函数))肯定会被调用?
如果我将一个带有静态初始化(构造函数,对象等)的文件放到gcc命令行的末尾:
g++ -shared -fPIC source1.o source2.o MyLastInitChance.o
Run Code Online (Sandbox Code Playgroud)
这个文件的静态构造函数是否保证最后被调用?我试验过,当我改变源文件的顺序时,printfs的顺序改变了; 但它是否在某处指定并保证在编译系统/计算机上相同?
例如,引用:
在链接时,gcc驱动程序在所有可重定位文件之前立即放置crtbegin.o,在所有可重定位文件之后立即放置crtend.o.©
根据我的理解,上面的引用暗示传递给链接器的.o文件的顺序定义了静态初始化的顺序.我对么?
另一个有趣的解决方案可能是编写一个GCC插件来调整静态初始化(例如将代码添加到.ctors部分等).但这只是一个可能有人可以扩展的想法.
这里介绍了另一种可能的解决方案.简而言之,可以使用外部构建后工具来重新排序可执行文件(库)中的.ctors条目.但我不是ELF格式的专家; 我想知道这是否可行且容易以这种方式调整.so文件.
我感兴趣的是解决一个特定的问题,或证明它是不可能解决的(至少为什么上面的解决方案不起作用).
有时我忘了,当我使用的返回值有到.例如
var s = "foobar";
s.Replace("foo", "notfoo");
// correct: s = s.Replace("foo", "notfoo");
Run Code Online (Sandbox Code Playgroud)
这也适用于我的自定义类值类,例如,我使用流体x.WithSomething()方法返回新值对象而不是修改x.
一种解决方案是使用单元测试.但是,这并不总是适用.那么,当不使用返回值时,如何强制编译器 - 或者至少是运行时错误?
也许,有一个ReSharper或VS解决方案?
更新:好的,它不是由语言强制执行的.所以null参数是,但如果参数为null,我仍然可以抛出异常.ReSharper可以向我发出很多关于C#未强制执行的事情的警告.但我认为没有办法对未使用的返回值做同样的事情 - 对于那些我想要使用的返回值.
如果不是系统函数(比如string.Replace),但至少对于我自己的类 - 有什么办法吗?比如,返回RequiredReturn <T>或类似的东西.
更新:AOP/PostSharp怎么样?如果我使用[UsageRequired]标记返回值或方法,是否可以使用PostSharp以某种方式检测到使用了返回值?
(注意C#标签)
在模板中,我想将模板参数向下钻取到真实的非模板化类型.所以:
template <typename T>
struct MyTemplate
{
// sadly there's no extract_Base
typedef typename extract_base<T>::MyType WorkType;
};
struct X {};
template <typename T> struct Templ {};
//MyTemplate<Templ<X>>::WorkType is X;
//MyTemplate<X>::WorkType is X;
Run Code Online (Sandbox Code Playgroud)
我看到的唯一解决方案是定义真正的基类型,如std :: vector <X> :: value_type是X.但我很好奇是否有办法在不在每个目标模板中定义辅助类型的情况下执行此操作.
我看到像http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2965.html这样的东西,但这是草稿?而且我不太清楚.
是的,我知道有多重继承,但即使对于简单的情况,这也不错.
更新:Nawaz解决方案非常适合我,并且很容易扩展到特定情况,例如
template<template<typename, typename> class X, typename T1, typename T2>
struct extract_base <X<T1, T2>> //specialization
{
typedef T1 base;
};
Run Code Online (Sandbox Code Playgroud)
我甚至可以将is_base_of或其他过滤器应用于T1/T2等等.因此,它不会对X <T,U>工作-至少使用g ++ 4.6.7.
我在jQuery中使用ajaxForm,并且Firefox存在一个问题 - 由于某种原因它不保留X-Requested-With自定义标头(用于检测IsAjaxRequest()).这导致我的控制器操作返回完整视图而不是部分,因为IsAjasxRequest()重定向后返回false.
此错误仅发生在Firefox中,例如在Chrome中可以正常工作.
你可以看到提到这个bug 在这里.一个非常古老的帖子,所以我想知道为什么它仍然发生在我身上(我使用Firefox 3.5.3).无论如何,这是我发明的解决方案 - 在我的基本控制器类中:
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
var ajaxRequestBeforeRedirect = TempData["__isajaxrequest"] as string;
if (ajaxRequestBeforeRedirect != null)
Request.Headers.Add("X-Requested-With", ajaxRequestBeforeRedirect);
}
private bool IsRedirectResult(ActionResult result)
{
return result.GetType().Name.ToLower().Contains("redirect");
}
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
if (IsRedirectResult(filterContext.Result) && Request.Headers["X-Requested-With"] != null)
TempData["__isajaxrequest"] = Request.Headers["X-Requested-With"];
}
Run Code Online (Sandbox Code Playgroud)
有用; 但是,我有两个问题:
更新:对于那些对此问题感兴趣的人,Request.Headers.Add与IIS6(或者IIS5,但无论如何)有问题.所以正确的方法是在TempData/HttpContext.Items/base控制器中存储这个"isAjaxRequest"标志.
我想使用realloc来增加内存大小,同时保持指针不变(因为调用者使用它).realloc并不总是如此; 有时它返回一个不同的指针并释放旧的指针.我想"尝试"重新分配内存,如果不可能,使用原始指针回退到另一个方法 - 但realloc已经破坏了!
有没有办法尝试增加malloc的内存而不破坏(作为realloc)旧指针,如果它不可能?
例如
void *pold;
void *pnew = realloc(pold, newsize);
if (pnew != pold)
{
free(pnew);
DoDifferently(pold); // but pold is freed already
}
Run Code Online (Sandbox Code Playgroud)
PS我不关心可移植性(仅限linux,因此标签).
在mxgraph中有泳道示例,但它不是自动的.所以我把graphlayout示例作为基础代替,并做了一些改动:
以下是我创建泳道的方法:
var lane1 = graph.insertVertex(parent, null, 'Lane 1', 0, 0, 1000, 100, 'swimlane');
var lane2 = graph.insertVertex(parent, null, 'Lane 2', 0, 100, 1000, 100, 'swimlane');
// use as parent...
var v1 = graph.insertVertex(lane1, null, 'A', 0, 0, w, h);
Run Code Online (Sandbox Code Playgroud)
并执行布局:
layout.orientation = mxConstants.DIRECTION_WEST;
layout.resizeParent = true;
layout.execute(parent, [lane1, lane2]);
Run Code Online (Sandbox Code Playgroud)
这是测试页面.
现在,这里有两个问题: