小编ins*_*pid的帖子

何时隐藏具体类中的继承层次结构?

每当我遇到一个工厂将一个基于某种"低级"类型参数(如协议或外部资源的格式)的抽象基类实现返回给用户的情况时,我总是试图将其转换为将抽象类转换为具有内部"策略工厂"的具体类,以便用户可以将实现类型传递给构造函数并直接使用基类.

我注意到.Net框架选择以这种方式实现Socket(而不是创建一个DatagramSocket,你在构造时传递SocketType).有哪些指导方针可以决定何时将层次结构扁平化为像这样的单个具体类?

inheritance constructor types design-patterns factory

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

测试第三方库的智能包装

假设你需要使用一个不必要的复杂,很难嘲笑(也许它有具体的类不带虚拟接口),与一些外部资源整合,如插座或数据库,以及不可靠的第三方库.您决定创建"包装器"接口/类以大大简化此库的使用,并允许使用包装器的开发人员继续编写可测试代码.包装器的界面看起来与原始界面完全不同.

我有一些关于如何测试这个包装器的问题.

  1. 是否应该在没有外部资源的情况下测试包装器,方法是在可以模拟的坏库上开发方法方法层?

  2. 当您使用第三方库(使用外部资源)测试包装类时,这是单元测试还是集成测试?如果外部资源可以在自动化测试期间嵌入到内存中,它仍然是集成测试吗?

  3. 在什么时候我们放弃嘲弄和抄袭并说我们有一个单位.根据维基百科"一个单元是应用程序中最小的可测试部分".但我发现这很难衡量.如果速度是决定我们是否正在测试一个单元的一个因素,那么您如何确定将该测试称为单元测试的速度有多慢?

testing tdd integration integration-testing unit-testing

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

Java EE:从域模型动态创建和删除套接字侦听器

我正在创建一个Java EE应用程序,允许用户从Web界面添加/删除"socketinfo"表(存储在数据库中).如果用户从Web界面启用"socketinfo",则应用程序服务器必须为传入的数据包创建套接字侦听器并处理数据.如果用户禁用或删除"socketinfo",则必须删除套接字侦听器.整个产品必须包含在一只耳朵中,并且最好是顺从的.我考虑过但遇到问题的一些方法是:

  1. 为套接字创建JCA资源适配器并使用MDB作为侦听器.我遇到的问题是,当用户添加MDB时,我无法弄清楚如何以编程方式为不同的套接字部署MDB.

  2. 创建一个@ Singleton/@ Service ejb,通过仔细同步来管理守护程序线程.单例ejb可以注入业务层,以便在正确的工作流程中进行CRUD操作和套接字操作.这里的问题是,据说从EJB创建线程被认为是一种不好的做法,并且不符合规范(即使正确处理了单例生命周期并且有适当的同步机制?).

  3. 将线程放在域模型中(另一个单例?)并让EJB使用该模型.这是所有这些中最糟糕的,因为应用程序服务器往往有多个类加载器,一般来说容器支持较少,而且这样做会受到影响.

知道如何在Java EE中正确处理这种情况吗?

编辑:这个问题的扩展:假设我决定像ewernli在他的解决方案3中所建议的那样处理这个问题,我在JCA(使用自定义接口添加内部线程)中做到这一点,我不会从中获得(精心设计的单身人士?虽然创建一个资源适配器看起来并不是一个可怕的任务,但它似乎并不是完全无关紧要的,可能需要花费一些时间(对于其他开发人员来说可能更难以遵循).

java domain-driven-design ejb jca java-ee

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

检查状态(单线程)后,WCF通道是否可能出现故障?

我一直以这种方式处理通道的关闭和中止:

public async Task<MyDataContract> GetDataFromService()
{
    IClientChannel channel = null;
    try
    {
        IMyContract contract = factory.CreateChannel(address);
        MyDataContract returnValue = await player.GetMyDataAsync();
        channel = (IClientChannel);
        return returnValue;
    } 
    catch (CommunicationException)
    {
       // ex handling code
    } 
    finally
    {
        if (channel != null)
        {
            if (channel.State == CommunicationState.Faulted)
            {
                channel.Abort();
            }
            else
            {
                channel.Close();
            }
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

假设只有一个线程使用该通道.检查状态后,我们怎么知道通道不会出错?如果发生这样的事情,代码将尝试Close()和Close()将在finally块中抛出异常.关于为什么这是安全/不安全的解释以及更好,更安全的方式的例子将不胜感激.

.net c# wcf

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

依赖注入,单元测试和信息隐藏

假设你有一个类Foo,类型为Bar的私有成员.您不希望用户知道Foo的实现包含一个Bar,并且您不希望用户能够创建自己的Bar并通过Foo的构造函数,任何其他方法或配置文件传递它.

编辑:Bar也存在问题,因为它访问测试环境控制之外的资源,例如特殊数据库,网络连接或其他进程.

当你还希望能够对Foo进行单元测试时,你会怎么做?依赖注入仍然可能吗?这是否意味着Bar和Foo过于紧密耦合(即使依赖是单向的)并且这种情况永远不可接受?

unit-testing information-hiding dependency-injection

3
推荐指数
1
解决办法
605
查看次数

ConcurrencyMode Multiple vs Async/Await

假设你有一个WCF服务

[ServiceBehavior(
    IncludeExceptionDetailInFaults = true, 
    InstanceContextMode = InstanceContextMode.Single,
    ConcurrencyMode = ConcurrencyMode.Multiple,
    UseSynchronizationContext = false)]
Run Code Online (Sandbox Code Playgroud)

在此实现下使用async/await模式进行服务操作有何不同?即使没有使用async/await,服务调用也不会被异步并且可能异步执行?即使在阅读了很多msdn和博客文章之后,上述情况对我来说仍然不明确,我会将操作异步化为安全.

.net wcf asynchronous async-await

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