小编Jef*_*eff的帖子

ExpressionVisitor.Visit <T>做什么?

在有人喊出答案之前,请先阅读问题.

.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)

linq expression-trees expressionvisitor c#-4.0

6
推荐指数
1
解决办法
3723
查看次数

表达式树依赖性分析器

我正在为交叉数据源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>是一个简单的可查询包装器,具有我自己的提供程序,它有机会解析树,找出在使用不同的查询提供程序交换根之前要做什么.因此,在上述情况下,我需要:

  1. 使用本地对象上下文对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();

  2. 通过以下序列化发送并让它在我的远程WCF服务上执行,然后返回结果.

    // Send the preceeding expression over the over the wire
    // and …

c# linq lambda expression-trees

6
推荐指数
1
解决办法
1036
查看次数

MSTest TestMethod依赖注入

我正在使用DI容器,我想用容器中解析的实例进行MSTest(VS 2010)单元测试.

我想将这些实例注入我的TestMethod或至少我的TestClass.这可能吗?

现在我的TestMethods直接调用container.Resolve<T>(xxx)我宁愿避免的,这样我的注射测试更加真实.

有人有这方面的经验吗?

提前致谢.

.net mstest dependency-injection visual-studio-2010

6
推荐指数
2
解决办法
2710
查看次数

构造函数注入替代品(Castle Windsor)

我喜欢构造函数注入依赖注入.它强制从类型中明确声明问题,并有助于可测试性.

我喜欢Constructor注入,在大多数地方......

记录我不喜欢的例子.如果我有一个基类,许多其他类继承,我希望所有这些类都使用我的ILogger(或其他)的实例,我不想要一个静态工厂(Logger.Instance)...我不希望必须在每个采用ILogger的子类上声明构造函数.

所以,我可以让我的基类将logger声明为Property并让它以这种方式注入

public class MyBaseClass 
{
   public ILogger Logger { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

...但

  1. 这并不能保证Logger 实际上被注入并且不是null.
  2. 我不喜欢让ILogger使用公共场景

那么......我还有其他选择吗?(我正在使用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

6
推荐指数
1
解决办法
2402
查看次数

存储库与域服务

我越是探索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.而客户是一些聚合根.

请告诉我存储库方法更好.

谢谢.

.net domain-driven-design repository repository-pattern

6
推荐指数
1
解决办法
2044
查看次数

使用自定义权限加载程序集

我需要将不受信任的程序集加载到我的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

我不太明白如何用新的安全模型完成我想要的东西......有人可以解释或建议一种替代方法吗?

谢谢.

.net code-access-security

5
推荐指数
1
解决办法
225
查看次数

实体框架多对象上下文

这个问题已经以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)

图中的所有关系似乎都未被设置.

我怎样才能解决这个问题?

.net c# architecture entity-framework entity-framework-4

5
推荐指数
2
解决办法
2万
查看次数

实体框架EDMX复制到输出目录

我把我的edmx Metadata Artifact Processing设置为Copy to Output Directory.使用模型将csdl/msl/ssdl复制到项目的bin目录中,但是引用此项目的其他项目都没有将工件复制到bin目录中.

我有几个需要这些文件的end exes/services/etc,我不想为所有这些文件添加post build任务.有什么方法可以正确部署这些资源吗?或者我可以以某种方式使用原始edmx文件(而不是csdl/msl/ssdl)?

谢谢.

.net entity-framework entity-framework-4

5
推荐指数
1
解决办法
1450
查看次数

数据库日志表结构

我正在创建一些用于存储日志条目的数据库表.在正常情况下,我总是会规范化并且永远不会把价值放在一起,但我并不是100%确信这是一个好主意.

我可以正常化并拥有:

  • LogEntry
  • LogEntryCategory
  • LogCategory
  • LogEntryProperty

LogEntry与LogCategory具有多对多关系,LogEntry与LogEntryProperty(名称/值对)具有1对多的关系.

Alternative是一个非规范化版本,它只有LogEntry,类别存储为逗号分隔的字符串类别列表,属性存储为Name:Value格式化属性的逗号限制列表.听起来很丑陋,从报告,性能和可搜索性的角度来看,我不确定这是不是更好.

哪个更好?

谢谢.

logging database-design

5
推荐指数
1
解决办法
8006
查看次数

Wix内阁缓存不起作用

我似乎无法让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

我怎样才能使这个工作或进一步调试问题?

windows-installer wix

5
推荐指数
1
解决办法
358
查看次数