小编sma*_*man的帖子

9
推荐指数
1
解决办法
3102
查看次数

锁定非静态字段有什么问题?锁定特定实例的正确方法是什么?

为什么锁定非静态字段被认为是不好的做法?

并且,如果我没有锁定非静态字段,那么如何锁定实例方法而不将该方法锁定在相同或派生类的所有其他实例上?

我写了一个例子来使我的问题更清楚.

public abstract class BaseClass
{

    private readonly object NonStaticLockObject = new object();
    private static readonly object StaticLockObject = new object();

    protected void DoThreadSafeAction<T>(Action<T> action)
        where T: BaseClass
    {
        var derived = this as T;
        if(derived == null)
        {
            throw new Exception();
        }
        lock(NonStaticLockObject)
        {
            action(derived);
        }
    }
}
public class DerivedClass :BaseClass
{
    private readonly Queue<object> _queue;
    public void Enqueue(object obj)
    {
        DoThreadSafeAction<DerivedClass>(x=>x._queue.Enqueue(obj));
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我对它进行了锁定StaticLockObject,那么该DoThreadSafeAction方法将被锁定所有派生的类的实例,BaseClass这不是我想要的.我想确保在锁定对象的特定实例时没有其他线程可以调用方法.

更新

谢谢大家的帮助:我发布了另一个问题,作为您提供的一些信息的后续跟进.由于您似乎精通这一领域,我发布了链接:此锁定和管理锁定异常的解决方案有什么问题?

c# multithreading deadlock locking thread-safety

9
推荐指数
2
解决办法
3381
查看次数

如何记录谓词表达式?

通常,我的存储库具有用于调试目的的日志记录语句,允许我查看参数的值.最近,我走上了创建通用存储库的道路,该存储库将谓词Expression作为参数获得了极大的灵活性,但是我无法找到一种将条件记录到远程有用位置的正确方法.

示例方法:

public int GetCount<K>(Expression<Func<K, bool>> predicate) where K : class
{
    Logger.LogDebugMessage(String.Format("Parameters [predicate: {0}]", predicate == null ? string.Empty : predicate.Body.ToString()));

    ...
}
Run Code Online (Sandbox Code Playgroud)

你可以看到我现在正在使用Body.ToString(),但结果不是那么可读:

Parameters [predicate: (fa.SomeId == value(NameSpace.SomeClass+<>c__DisplayClass2).SomeId)]

最终我希望看到的内容类似于以下内容:

Parameters [predicate: (fa.SomeId == 1 && fa.Account.Name == "MyName").SomeId)]

从本质上讲,这个日志的值能够在爆炸时知道输入值.有没有什么方法可以强迫API的用户将谓词作为字符串提供?

c# linq entity-framework repository linq-expressions

9
推荐指数
1
解决办法
1969
查看次数

如何从DataContext的跟踪机制中分离LINQ-to-SQL数据对象?

在询问了这个问题后,我被告知该Table<T>.Attach()方法是如何工作的,我还有另外一个问题.

如何从DataContext状态跟踪机制中分离LINQ-to-SQL数据对象?基本上,我想拉一条记录并更改记录上的数据.但是,当我调用SubmitChanges()同一个DataContext实例时,除非我明确调用,否则我不希望更新记录Attach().这是如何完成的?

c# linq datacontext linq-to-sql

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

如何使用反射获取ValueType类型的默认值

如果我有一个值类型的泛型类型参数,我想知道一个值是否等于默认值我测试它像这样:

static bool IsDefault<T>(T value){
    where T: struct
    return value.Equals(default(T));
}
Run Code Online (Sandbox Code Playgroud)

如果我没有泛型类型参数,那么我似乎必须使用反射.如果该方法必须适用于所有值类型,那么执行此测试的方法是否比我在此处所做的更好?:

static bool IsDefault(object value){
   if(!(value is ValueType)){
      throw new ArgumentException("Precondition failed: Must be a ValueType", "value");
   }
   var @default = Activator.CreateInstance(value.GetType());
   return value.Equals(@default);  
}
Run Code Online (Sandbox Code Playgroud)

另外,在评估Nullable结构方面,我有什么不考虑的吗?

c# reflection struct default default-constructor

9
推荐指数
2
解决办法
5475
查看次数

如何通过Cypher中的属性名称字符串访问和改变节点属性值?

我的目标是在cypher查询访问和改变节点的属性,其中要访问和变异的属性的名称是未知的字符串值.

例如,考虑一个命令:

查找包含两个属性的所有节点,以使第一个属性的名称为小写,后者的名称为前者的大写表示. 然后,使用小写字符串名称将属性的值传播到具有大写名称的属性的值.

特殊情况很简单:

MATCH ( node )
WHERE has(node.age) AND has(node.AGE) AND node.age <> node.AGE
SET node.AGE = node.age
RETURN node;
Run Code Online (Sandbox Code Playgroud)

但我似乎无法找到在单个请求中实现一般情况的方法.

具体来说,我无法:

  1. 使用字符串和值访问节点的属性
  2. 使用字符串和值来突变节点的属性

为了清楚起见,我将包括我处理一般情况的尝试.在我未能修改节点属性的情况下,我能够生成一个命令的密码,如果它在后续事务中执行,它将完成我的最终目标.

MERGE ( justToMakeSureOneExists { age: 14, AGE : 140 } ) WITH justToMakeSureOneExists 
MATCH (node) 
WHERE  ANY ( kx IN keys(node) WHERE kx = LOWER(kx) AND ANY ( ky in keys(node) WHERE ky = UPPER(kx) ) )
REMOVE node.name_conflicts // make sure results are current
FOREACH(kx …
Run Code Online (Sandbox Code Playgroud)

reflection neo4j graph-databases cypher

9
推荐指数
1
解决办法
465
查看次数

架构两个独立数据库的最佳方法?

我在工作中遇到了以下问题,而且我没有经验或知识来回答它们,我希望你们中的一些人能够指出我正确的方向,任何答案将不胜感激!

脚本

我们有两个方面的业务使用单独的数据库,人力资源和业务领域(家庭护理).
人力资源部门跟踪公司的员工,轮班模式,缺勤,薪酬等.Homecare会跟踪客户信息,家访,访问日期以及负责提供访问的员工.

这两个系统是分开的,我们目前正在寻找集成它们的方法.

此外,我们正在研究如何将查看这两个数据库的代码组织成可重用,有组织的库.

我们有三个应用程序重用HumanResources.dll,负责与库中包含的EF 4对象上下文进行通信.对象上下文几乎是数据库的镜像.

问题


我们即将添加第四个将使用HR数据库中的数据的应用程序.

我们要不要:

创建一个新的EF数据模型,负责提供只有应用程序需要的信息,同时复制一些常见的实体,如Employee.

要么

将新实体/表添加到已经很大的模型中并接受它将变大.


从长远来看,我们需要将人力资源数据库中的班次模式信息加入第5个应用程序中的操作区域(家庭护理)数据库中的客户访问.

我们已经了解了我们能做些什么; 我们提出以下建议:

创建一个位于HumanResources对象上下文和Homecare对象上下文之间的层,负责将两组数据连接在一起.

还有其他方法可以使我们受益吗?

architecture integration database-design facade entity-framework-4

8
推荐指数
1
解决办法
721
查看次数

如何确定ParameterInfo是否是泛型类型?

我有MethodInfo一个GenericMethodDefinition.如:CallMethod<T>(T arg, string arg2).GetParameters()方法将为我提供两个ParameterInfo对象,第一个是通用的,第二个不是.如何让ParameterInfo告诉我它是通用的?如果它有约束怎么办?

c# generics reflection methodinfo parameterinfo

7
推荐指数
1
解决办法
1507
查看次数

在ASP.NET MVC中实现存储库模式

我仍然很难绕过这个.我想像我这样分开我的图层(dll):

1)MyProject.Web.dll - MVC Web App(控制器,模型(编辑/查看),视图)
2)MyProject.Services.dll - 服务层(业务逻辑)
3)MyProject.Repositories.dll - 存储库
4)MyProject. Domain.dll - POCO类
5)MyProject.Data.dll - EF4

工作流程:

1)控制器调用服务以获取对象以填充视图/编辑模型.
2)服务调用存储库来获取/持久化对象.
3)存储库调用EF以从SQL Server获取/持久化对象.

我的存储库返回IQueryable(Of T),在其中它们使用ObjectSet(Of T).

所以我看到这一点,图层完全依赖于下一层和包含POCO类的lib?

一些问题:

1)现在我的存储库与EF一起正常工作,它们将依赖于System.Data.Objects,现在我在我的存储库层与EF紧密耦合,那是不是很糟糕?

2)我正在使用UnitOfWork模式.那住哪儿?它有一个Property Context As ObjectContext,因此它也与EF紧密耦合.坏?

3)我如何使用DI使这更容易?

我希望这是一个松散耦合的测试.有什么建议?

----------编辑----------

如果我在这里正确的轨道,请告诉我.另外,因此服务器注入一个IRepository(Of Category)权限,它如何知道它与EFRepository(Of T)的具体类之间的区别?与UnitOfWork和服务相同?

一旦有人帮助我把它弄清楚到我所理解的地方,我知道它看起来似乎微不足道,但是男人,我有一个时间包围我的头!

调节器

Public Class CategoryController
    Private _Service As Domain.Interfaces.IService

    Public Sub New(ByVal Service As Domain.Interfaces.IService)
        _Service = Service

    End Sub

    Function ListCategories() As ActionResult
        Dim Model As New CategoryViewModel

        Using UOW As New Repositories.EFUnitOfWork
            Mapper.Map(Of Category, CategoryViewModel)(_Service.GetCategories)
        End Using

        Return …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc unit-of-work repository-pattern service-layer entity-framework-4

7
推荐指数
1
解决办法
4001
查看次数

有没有办法将泛型类型参数限制为匿名类型?

有没有办法将泛型类型参数限制为C#4.0中的匿名类型?或者是where T: class我最接近的人?

.net c# generics anonymous-types c#-4.0

7
推荐指数
1
解决办法
633
查看次数