在有人喊出答案之前,请先阅读问题.
.NET 4.0的ExpressionVisitor中该方法的目的是什么:
public static ReadOnlyCollection<T> Visit<T>(ReadOnlyCollection<T> nodes, Func<T, T> elementVisitor)
Run Code Online (Sandbox Code Playgroud)
我对该方法的目的的第一个猜测是,它将访问nodes参数指定的每个树中的每个节点,并使用elementVisitor函数的结果重写树.
情况似乎并非如此.实际上这种方法似乎比什么都没有,除非我在这里遗漏了一些东西,我强烈怀疑我是......
我尝试在我的代码中使用此方法,当事情没有按预期工作时,我反映了方法并发现:
public static ReadOnlyCollection<T> Visit<T>(ReadOnlyCollection<T> nodes, Func<T, T> elementVisitor)
{
T[] list = null;
int index = 0;
int count = nodes.Count;
while (index < count)
{
T objA = elementVisitor(nodes[index]);
if (list != null)
{
list[index] = objA;
}
else if (!object.ReferenceEquals(objA, nodes[index]))
{
list = new T[count];
for (int i = 0; i < index; i++)
{
list[i] = nodes[i];
} …Run Code Online (Sandbox Code Playgroud) 我正在为交叉数据源IQueryProvider构建表达式树依赖性分析器.
也就是说,我有一个IQueryable,其中包含一些可以在内存中针对某个任意提供程序(比如Entity Framework)执行的元素.IQueryable中的一些其他元素违反了我需要进行远程WCF调用的实体.WCF操作采用序列化表达式树,对其进行反序列化,对自己的本地数据存储执行LINQ查询(也就是说实体框架),然后将结果发回给我(尽管这种机制可以很容易地成为WCF数据服务) DataServiceQuery ......但我没有使用它,因为它的功能支持水平是有限的...充其量).一旦我从WCF服务返回结果,我将针对本地执行的LINQ查询在内存中执行LINQ查询的结果.
那么,那有什么难的呢?好吧,我需要确定表达式树的依赖关系,以便我的本地底层查询提供程序不会爆炸尝试执行我的LINQ查询,该查询具有只能在远程WCF服务上执行的组件......反之亦然.
我们来看一个简单的场景:
var result =
(from entityX in new Query<MyEntityX>()
from entityY in new Query<MyEntityY>()
where entityX.SomeProperty == "Hello" &&
entityY.SomeOtherProperty == "Hello 2" && entityX.Id == entityY.XId).ToList();
Run Code Online (Sandbox Code Playgroud)
Query<T>是一个简单的可查询包装器,具有我自己的提供程序,它有机会解析树,找出在使用不同的查询提供程序交换根之前要做什么.因此,在上述情况下,我需要:
使用本地对象上下文对MyEntityA执行查询,并仅应用myEntityX.SomeProperty == "Hello"条件.也就是说,在本地运行以下命令:
// assume the functionality for replacing new Query<MyEntityA> with new
// ObjectContext<MyEntityA>() is already there...
var resultX = (from entityX in new Query<MyEntityX>()
where entityX.SomeProperty == "Hello").ToList().AsQueryable();
通过以下序列化发送并让它在我的远程WCF服务上执行,然后返回结果.
// Send the preceeding expression over the over the wire
// and …
我正在使用DI容器,我想用容器中解析的实例进行MSTest(VS 2010)单元测试.
我想将这些实例注入我的TestMethod或至少我的TestClass.这可能吗?
现在我的TestMethods直接调用container.Resolve<T>(xxx)我宁愿避免的,这样我的注射测试更加真实.
有人有这方面的经验吗?
提前致谢.
我喜欢构造函数注入依赖注入.它强制从类型中明确声明问题,并有助于可测试性.
我喜欢Constructor注入,在大多数地方......
记录我不喜欢的例子.如果我有一个基类,许多其他类继承,我希望所有这些类都使用我的ILogger(或其他)的实例,我不想要一个静态工厂(Logger.Instance)...我不希望必须在每个采用ILogger的子类上声明构造函数.
所以,我可以让我的基类将logger声明为Property并让它以这种方式注入
public class MyBaseClass
{
public ILogger Logger { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
...但
那么......我还有其他选择吗?(我正在使用Castle Windsor).
我打算制作一个界面
public interface IInitializable<T>
{
void Initialize(T instance);
}
public class MyBaseClass : IInitializable<ILogger>, ...could have other IInitializables too...
{
protected ILogger Logger { get; private set; }
public void Initialize(ILogger instance)
{
Logger = instance;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在我的容器上有一个工具,它自动调用所有IInitializable<T>类型构造的实现......
但在我走这条路之前,我想知道其他人的想法是什么......
.net dependency-injection castle-windsor inversion-of-control
我越是探索DDD和存储库,我就越觉得自己被域服务方法所吸引.
我的直觉中的某些东西并不像存储库(至少在我一直在阅读的示例和文章中)不是单一语句原子这一事实.
using (var customerRepository = GetCustomerRepository())
{
customerRepository.AddCustomerForDelete(someCustomer);
customerRepository.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
有一些我不喜欢的东西.通常,存储库本身成为一个问题,必须维护(它是IDisposable并需要"提交").我似乎并没有抽象出持久性问题.
一个更简单的方法,似乎在我的肠道中更好地是:
GetCustomerService().DeleteCustomer(someCustomer);
Run Code Online (Sandbox Code Playgroud)
这是原子的.没有用于维护,处置或保存更改的存储库实例.如果您真的需要在聚合根目录上的单个操作之外的工作单元支持,请合并某种数据范围支持(类似于TransactionScope):
using(var ds = new DataScope())
{
// both of these happen under the same underlying DbConnection or whatever
GetCustomerService().DeleteCustomer(someCustomer1);
GetCustomerService().DoSomethingElse(someCustomer2);
}
Run Code Online (Sandbox Code Playgroud)
在上述两种情况中,例如,假设它们位于某个业务控制器中,并且用于数据访问的底层机制(位于存储库或服务实现中)是实体框架ObjectContext.而客户是一些聚合根.
请告诉我存储库方法更好.
谢谢.
我需要将不受信任的程序集加载到我的AppDomain中.我不希望Sandbox为此程序集执行新的AppDomain,因为它在内部需要访问某些功能,例如HttpContext.Current(在单独的沙盒AppDomain中为null).
我认为执行此操作的旧方法是使用一些自定义证据调用Assembly.Load,但看起来这已经被4.0中的CAS更改废弃了:
http://msdn.microsoft.com/en-us/library/ms145229.aspx
http://msdn.microsoft.com/en-us/library/ee191568(VS.100).aspx
我不太明白如何用新的安全模型完成我想要的东西......有人可以解释或建议一种替代方法吗?
谢谢.
这个问题已经以50种不同的方式被问到了500个不同的时间......但是这里又一次,因为我似乎无法找到我正在寻找的答案:
我正在使用EF4和POCO代理.
答:我有一个从ObjectContext的一个实例中获取的对象图.该ObjectContext被释放.
B.我有一个从ObjectContext的另一个实例获取的对象.ObjectContext也被处理掉了.
我想在A中使用B中的实体设置一堆相关的属性....类似于
foreach(var itemFromA in collectionFromA)
{
itemFromA.RelatedProperty = itemFromB;
}
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我得到了例外:
System.InvalidOperationException occurred
Message=The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects.
Source=System.Data.Entity
StackTrace:
at System.Data.Objects.DataClasses.RelatedEnd.Add(IEntityWrapper wrappedTarget, Boolean applyConstraints, Boolean addRelationshipAsUnchanged, Boolean relationshipAlreadyExists, Boolean allowModifyingOtherEndOfRelationship, Boolean forceForeignKeyChanges)
at System.Data.Objects.DataClasses.RelatedEnd.Add(IEntityWrapper wrappedEntity, Boolean applyConstraints)
at System.Data.Objects.DataClasses.EntityReference`1.set_ReferenceValue(IEntityWrapper value)
at System.Data.Objects.DataClasses.EntityReference`1.set_Value(TEntity value)
at
Run Code Online (Sandbox Code Playgroud)
我想我需要将这些实体从ObjectContexts中分离出来,以便上面的代码可以工作......问题是,当它处理时从我的ObjectContext中分离所有实体似乎会破坏图形.如果我这样做:
objectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Deleted | EntityState.Modified | EntityState.Unchanged)
.Select(i => i.Entity).OfType<IEntityWithChangeTracker>().ToList()
.ForEach(i => objectContext.Detach(i));
Run Code Online (Sandbox Code Playgroud)
图中的所有关系似乎都未被设置.
我怎样才能解决这个问题?
我把我的edmx Metadata Artifact Processing设置为Copy to Output Directory.使用模型将csdl/msl/ssdl复制到项目的bin目录中,但是引用此项目的其他项目都没有将工件复制到bin目录中.
我有几个需要这些文件的end exes/services/etc,我不想为所有这些文件添加post build任务.有什么方法可以正确部署这些资源吗?或者我可以以某种方式使用原始edmx文件(而不是csdl/msl/ssdl)?
谢谢.
我正在创建一些用于存储日志条目的数据库表.在正常情况下,我总是会规范化并且永远不会把价值放在一起,但我并不是100%确信这是一个好主意.
我可以正常化并拥有:
LogEntry与LogCategory具有多对多关系,LogEntry与LogEntryProperty(名称/值对)具有1对多的关系.
Alternative是一个非规范化版本,它只有LogEntry,类别存储为逗号分隔的字符串类别列表,属性存储为Name:Value格式化属性的逗号限制列表.听起来很丑陋,从报告,性能和可搜索性的角度来看,我不确定这是不是更好.
哪个更好?
谢谢.
我似乎无法让wix cabinet缓存工作.
我有
<PropertyGroup>
<CabinetCreationThreadCount>3</CabinetCreationThreadCount>
<CabinetCachePath>cabs</CabinetCachePath>
<ReuseCabinetCache>True</ReuseCabinetCache>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
在wixproj.
<Media Id="1" Cabinet="contents.cab" EmbedCab="yes" CompressionLevel="mszip"/>
<Media Id="2" Cabinet="static.cab" EmbedCab="yes" CompressionLevel="mszip"/>
Run Code Online (Sandbox Code Playgroud)
在wxs中
和我所知道的100%永远不会改变标记的组件
<Component DiskId="2" ...
Run Code Online (Sandbox Code Playgroud)
我看到cabs目录中生成的cab文件,但每次构建时,我都会看到cab文件更改的修改时间,这表明它重新生成了cabinet,而不是重用缓存中的那个.
使用Wix 3.6
我怎样才能使这个工作或进一步调试问题?
.net ×6
c# ×2
linq ×2
architecture ×1
c#-4.0 ×1
lambda ×1
logging ×1
mstest ×1
repository ×1
wix ×1