小编Son*_*ate的帖子

VS2010/C#中的全局"使用"指令?

我很确定我知道答案,但我想知道是否有办法在我的C#项目中定义全局"使用"指令,这样我就不必在每个代码文件的顶部重复该指令.

我的兴趣实际上源于在.NET Framework中引入扩展方法.使用扩展方法的唯一方法是为包含扩展方法的命名空间定义using指令.没有using指令,我失去了扩展方法的Intellisense功能,这意味着我不会总是看到可用的方法.

作为框架开发人员,确保框架中提供的类型和方法清晰可供开发人员使用对我来说至关重要.虽然文档和培训服务于他们的目的,但我发现大多数开发人员都会按时完成并滚动智能感知列表以查看可用的方法和属性.即使他们转到对象浏览器或查看参考文档,他们也不会知道扩展方法,除非他们知道它.这就是Intellisense的用武之地.

而且,虽然我可以将使用指令添加到VS使用的模板,但VS中的"删除并排序"选项将删除引用扩展方法的指令(如果没有使用).

那么,所有这一切,是否有任何方法可以在VS 2010中定义全局"使用"指令?如果没有,MS将来会考虑它的任何机会吗?

c# using-directives using-statement .net-4.0 visual-studio-2010

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

VS2010中的单元测试3.5项目产生CS1685警告

我有一个面向.NET 3.5的开发项目.我没有选择这个,因为公司的大假发不会让我们以4.0为目标.我在Visual Studio 2010中为解决方案添加了一个新的测试项目.我看到我只能从测试项目中定位4.0 Framework(这是可以的,因为它没有部署).

除了我从我的测试项目中收到编译器警告之外,一切都很棒:

警告CS1685:预定义类型'System.Action'在全局别名中的多个程序集中定义; 使用'c:\ Program Files\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\System.Core.dll'中的定义

我从测试项目中删除了对System.Core的引用,警告仍在进行中.我只能假设这是因为我正在测试的项目是针对3.5的,所以有些东西正在被越过.在我们的应用程序中获得批准目标4.0之前,是否有清除方法来消除此警告?

unit-testing visual-studio-2010 visual-studio

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

映射子对象时,AutoMapper传递父引用

我正在尝试使用AutoMapper将从Web服务接收的一些DTO(数据协定)对象映射到我的业务对象中.根DTO对象包含子对象的集合.我的业务对象还有子业务对象的子集合.为了让AutoMapper工作,我必须在业务对象的collection属性中包含一个setter,否则该collection将始终为空.另外,我必须在集合类型中添加一个默认构造函数.因此,在我看来,AutoMapper正在实例化一个新的集合对象,填充它并设置为我的业务对象的集合属性.

虽然这一切都很好,但我还有一些额外的逻辑,当创建集合并使默认构造函数失败时,必须将其连接起来.从本质上讲,我正在建立父子关系,并将一些事件连接起来,以便它们从孩子到父母一起冒泡.

我想要做的是让AutoMapper简单地将子对象从DTO的集合映射到我的BO上的现有集合.换句话说,跳过创建新集合并简单地使用业务对象已有的集合.

有没有办法轻松完成这个?!?!?

UPDATE

也许更好的问题,以及对我的问题更简单的解决方案,是否可以定义AutoMapper在实例化时传递给集合的参数?我的子集合定义如下:

public class ChildCollection : Collection<ChildObjects>
{
    public ChildCollection(ParentObject parent) { Parent = parent; }
}
Run Code Online (Sandbox Code Playgroud)

如果我可以配置AutoMapper来使用这个构造函数并传入适当的对象,那将是完美的!

另一个更新

为了清楚起见,这里是问题空间中的其他类:

public class ParentObject
{
    private ChildCollection _children;

    public ChildCollection Children
    {
        get
        {
            if (_children == null) _children = new ChildCollection(this);

            return _children;
        }
    }
}

public class ParentDTO
{
    public ICollection<ChildDTO> Children { get; set; }
}

public class ChildDTO
{
    public String SomeProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我这样配置AutoMapper:

Mapper.CreateMap<ParentDTO, ParentObject>();
Mapper.CreateMap<ChildDTO, ChildObject>();
Run Code Online (Sandbox Code Playgroud)

这样做,我必须在ParentObject中的Children属性和ChildCollection的默认(无参数)构造函数中添加一个setter.虽然我可以解决定义父子关系的需要,但似乎期望AutoMapper支持在创建子集合时配置映射以使用特定构造函数.像这样的东西: …

collections parent-child automapper

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

让 Visual Studio 与多个服务引用共享命名空间

除了手动编码 Reference.cs 文件之外,是否有任何方法可以让 Visual Studio 允许多个服务引用共享命名空间?

我正在开发一个客户端应用程序,该应用程序使用属于同一解决方案的多个服务。类似于 Microsoft 为 MS-Project Server 提供的项目服务接口 (PSI) API。而不是为每个单独的服务引用使用不同的命名空间,例如:

MyProject.ProjectService.ProjectServiceClient
MyProject.ResourceService.ResourceServiceClient
MyProject.TimesheetService.TimesheetServiceClient
Run Code Online (Sandbox Code Playgroud)

如果我们可以将它们全部放入一个命名空间中,那就太好了,例如:

MyProject.Services.ProjectServiceClient
MyProject.Services.ResourceServiceClient
MyProject.Services.TimesheetServiceClient
Run Code Online (Sandbox Code Playgroud)

随之而来的是共享通用代码的能力。例如,如果这些服务中的任何一个暴露了相同的数据契约。现在,如果我想编写客户端可以使用的代码,我必须为每个服务代理创建一个单独的版本,因为公共契约存在于三个不同的命名空间中。看看我要去哪里?

有可能的?

更新

假设我无权访问服务代码(因为我没有),这意味着共享类库不是一个选项。在这种情况下我的选择是什么?

.net wcf service-reference

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

需要帮助确定要编写的单元测试

我有以下方法,我正在寻找有效的单元测试,也给我很好的代码路径覆盖:

public TheResponse DoSomething(TheRequest request)
{
    if (request == null)
        throw new ArgumentNullException("request");

    BeginRequest(request);

    try
    {
        var result = Service.DoTheWork(request.Data);

        var response = Mapper.Map<TheResult, TheResponse>(result);

        return response;
    }
    catch (Exception ex)
    {
        Logger.LogError("This method failed.", ex);

        throw;
    }
    finally
    {
        EndRequest();
    }
}
Run Code Online (Sandbox Code Playgroud)

该方法使用的Service和Logger对象被注入类构造函数(未显示).BeginRequest和EndRequest在基类(未示出)中实现.Mapper是用于对象到对象映射的AutoMapper类.

我的问题是为这样的方法编写单元测试的好的,有效的方法是什么,它还提供完整的(或有意义的)代码覆盖?

我是一对一测试主体的信徒,并且在VS-Test中使用Moq作为一个模拟框架(尽管我并没有因为这个问题而挂断了这个部分).虽然有些测试(例如确保传递null导致例外)很明显,但我发现自己想知道其他想到的是否有意义; 特别是当他们以不同的方式行使相同的代码时.

c# testing tdd unit-testing

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

使用IoC在SOA应用程序中使用DDD进行验证

在我的服务外观层,我有一个服务类,其方法/操作接受DTO(数据契约)对象.AutoMapper用于将此DTO映射到我的域对象的实例以应用任何更改.请求将传递到我的域服务,该服务执行实际工作.这是方法的样子:

public EntityContract AddEntity(EntityContract requestContract)
{
    var entity = Mapper.Map<EntityContract, Entity>(requestContract);

    var updatedEntity = Service.AddEntity(entity);

    var responseContract = Mapper.Map<Entity, EntityContract>(updatedEntity);

    return responseContract;
}
Run Code Online (Sandbox Code Playgroud)

使用构造函数注入和Unity作为IoC容器来设置Service和Mapper属性.

在执行操作时,域服务对实体进行更改,然后使用存储库来保存更改,如:

public Entity AddEntity(Entity entity)
{
    // Make changes to entity

    Repository.Add(entity);

    // Prepare return value
}
Run Code Online (Sandbox Code Playgroud)

还使用构造函数注入设置存储库.

问题是,一旦数据被持久化,数据立即可供其他客户端使用,因此我必须确保不会保留无效数据.我已经阅读了DDD(埃文斯)和尼尔森的"蓝皮书",我不清楚我应该采取什么样的验证方法.

如果我的目标是阻止实体进入无效状态,我应该在服务方法中验证entityContract以确保在将请求传递给我的域服务之前满足所有规则吗?我不愿意这样做,因为我似乎打破了在服务外观中定义这些规则的封装.

我们使用薄外观层委托给域服务的原因是我们在API中暴露了粗粒度的接口,但是通过细粒度域服务的组合支持重用.请记住,多个Facade服务可能正在调用相同的域服务方法,也许将这些规则委托给域服务会更好,因此我们知道每个用法都经过验证.或者我应该在两个地方验证?

我还可以在属性设置器中放置防护装置,防止不可接受的值将实体置于无效状态.这意味着AutoMapper在尝试映射无效值时会失败.但是,当没有映射值时,它没有帮助.

我仍然无法理解这些规则是实体行为的一部分,并且确定对象是否有效应该封装在实体中.这是错的吗?

首先,我需要确定执行这些验证检查的时间和地点.然后我需要弄清楚如何用DI实现,以便依赖关系解耦.

你能提供什么建议?

validation domain-driven-design

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

通过流畅的验证来抑制CA1062

我有一个流畅,可扩展的验证助手,如:

Assert.That(aParameter).IsNotNull();
Run Code Online (Sandbox Code Playgroud)

它是可扩展的,因为That方法实际上是通用的(即<T>)并使用隐式类型来返回通用的IAssertCondition <T>对象.IsNotNull实际上是一种扩展方法.

无论如何,使用这种方法验证传递给方法的参数的问题是我得到CA1062警告,指示我在使用之前验证参数,当然,我已经在做了.

我阅读了Eric Smith的帖子(这里)关于使用ValidatedNotNullAttribute来告知FxCop该参数是否正在验证但是我不知道如何使用我所描述的流畅接口来实现这一点.

我的选择是什么,以便代码分析能够认识到上述陈述满足要求并且警告不会出现?

code-analysis visual-studio-2010 static-code-analysis

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

ObservableCollection更改时重新评估LINQ查询

我有一个共同的问题,我希望(希望)找到一个更好的解决方案,以便向前发展.我有一个包含主数据列表的ObservableCollection.在我的客户端代码中,我需要将数据"转换"为新表单以显示给用户.我使用LINQ语句,如:

var newList = (from item in observable
               select new { FirstInitial = item.Name[0] });
Run Code Online (Sandbox Code Playgroud)

我知道这很简陋,但足以证明这个问题.(注意投影,这不是一个简单的过滤器或分组语句.)然后我通过数据绑定在我的UI中显示newList.

问题是,当原始集合发生更改时,UI不会.到目前为止我应用的解决方案是将事件处理程序附加到原始集合的CollectionChanged事件,该事件重新评估查询并更新绑定属性.

虽然这很好用,但每次遇到这种情况时,都会有很多重复的代码.有没有一种方法可以让LINQ查询返回一个ObservableCollection,它会在源Observable发生变化时"自动"更新?

换句话说,我想实现一些"预制"功能,这样我只要有这种情况就可以重复使用它.

UPDATE

感谢Scroog1帮助我看到我的原始帖子太过耦合到用户界面,因为我真的在问.以下示例作为问题的更好描述:

public class SomeClass
{
    private ObservableCollection<Employee> _allEmployees;
    private ObservableCollection<Employee> _currentEmployees;

    public ObservableCollection<Employee> CurrentEmployees
    {
        get
        {
            if (_currentEmployees == null)
                _currentEmployees = _allEmployees.Where(e => !e.IsTerminated);

            return _currentEmployees;
        }
    }
}

public class SomeViewModel
{
    private ICollectionView _view;

    public ICollectionView CurrentView
    {
        if (_view == null)
        {
            var cvs = new CollectionViewSource()
            {
                Source = someClass.CurrentEmployees
            }

            cvs.Add(new SortDescription("Name", ListSortDirection.Ascending)); …
Run Code Online (Sandbox Code Playgroud)

.net linq linq-to-objects observablecollection

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

使用 React 16+ 记录到 Splunk 的示例

我正在寻找展示如何从 React JS 16+ 应用程序将日志消息写入 Splunk 的示例。 Splunk 在其文档中有一个 TypeScript 片段,但我有兴趣了解其他人如何将其绑定到 React 框架中,以便正确配置和初始化所有内容以在应用程序中使用。

注意:我考虑过将 log4js 与 Splunk 的自定义附加程序一起使用,但也没有找到任何示例!

splunk reactjs splunk-sdk

5
推荐指数
0
解决办法
1559
查看次数

如何解决.NET套接字和TCP可能丢失的数据包问题?

我需要一些帮助,找出如何解决我正在使用.NET套接字通过TCP进行高容量数据馈送的问题.

简而言之,当客户端应用程序启动时,它将连接到服务器上的特定端口.连接后,服务器开始向客户端发送实时数据,以类似自动收报机的方式显示信息.服务器支持多个客户端工作站,因此数据将通过多个端口(多个套接字)发送.

一切都已实施,并且通过慢速进给和低音量工作.我正在对系统进行压力测试,以确保其可靠性和可扩展性.当我增加频率时,服务器运行完美.但是,我看到客户端上看起来丢失的数据包.这发生在随机时间.

当前,广播的每个消息的前面都有一个4字节的值,用于标识该消息的长度.当我们在客户端接收数据时,我们将数据附加到缓冲区(Stream),直到我们收到该字节数.任何其他字节都被视为下一条消息的开头.同样,这很有效,直到我调高频率.

在我的测试中,我发送一个大约225字节的数据包,然后发送一个大约310kB的数据包和另一个约40kb的数据包.每隔1秒发送一条消息,大约有12个客户端正在运行.将频率增加到1/2秒,我最终看到一个客户端的显示冻结.持续1/4秒,我可以在几秒钟内用少至4个客户端重现问题.

查看我的代码(我可以提供,如果需要),我看到所有客户端都在接收数据,但不知何故信息"不同步",预期长度值很大(在1亿范围内) .因此,我们只是继续阅读数据,从不认识到消息的结束.

我要么需要更好的方法,要么确保获得我期望的数据并且不丢失数据包.你能帮我吗?

UPDATE

我做了大量额外的测试,改变了消息的大小和交付频率.肯定存在相关性.我制作消息大小越小,我可以实现的频率越高.但是,不可避免地,我总能打破它.

因此,更准确地描述我正在寻找的是:

  1. 要了解发生了什么.这将帮助我确定可能的解决方案,或者至少为可靠行为建立阈值.

  2. 实现故障安全机制,以便在问题发生时,我可以处理它并可能从中恢复.也许在数据流中添加校验和或类似的东西.

这是我在客户端(接收)应用程序中运行的代码:

public void StartListening(SocketAsyncEventArgs e)
{
    e.Completed += SocketReceive;
    socket.ReceiveAsync(e);
}

private void SocketReceive(Object sender, SocketAsyncEventArgs e)
{
    lock (_receiveLock)
    {
        ProcessData(e.Buffer, e.BytesTransferred);

        socket.ReceiveAsync(e);
    }
}

private void ProcessData(Byte[] bytes, Int32 count)
{
    if (_currentBuffer == null)
        _currentBuffer = new ReceiveBuffer();

    var numberOfBytesRead = _currentBuffer.Write(bytes, count);

    if (_currentBuffer.IsComplete)
    {
        // Notify the client that a message has been received (ignore zero-length, "keep alive", messages)
        if (_currentBuffer.DataLength > …
Run Code Online (Sandbox Code Playgroud)

.net sockets

4
推荐指数
1
解决办法
1906
查看次数