小编Ben*_*Sch的帖子

洋葱与N层建筑

事先有一件事:我从N层背景到达.

我现在花了很多时间来了解洋葱建筑和相关的领域驱动概念,如六角建筑阅读资源,如Jeff Palermo的系列博客文章,Mark Seemann从DI视角的贡献,"洋葱化你的建筑",和"干净的建筑".

所有这些文章的共同之处在于它们声称有以下几点:

  • 焦点围绕业务用例的域模型
  • 通过强调依赖性倒置原则,在层之间进行更松散的耦合
  • 提高外部基础架构的独立性,例如框架,数据持久性,UI
  • 更好的可测试性/可维护性

嗯,这听起来非常好听,那些图表看起来也很甜美.但是问题出现在我身上:仅仅通过在传统的N层架构中增加外墙来实现这一切吗?

  • 每个层只知道下面层的抽象
  • 具体实现可以保持在每个层的内部,因此与抽象处于相同的位置
  • 实现细节可以很容易地换出,因为它们是层的内部,不应该影响应用程序的其余部分

请帮助我了解以域为中心的架构的真正优势.

提前致谢!

architecture dependency-injection inversion-of-control n-layer onion-architecture

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

Azure云服务角色实例 - 自动缩放 - 更改事件未触发

我获得了一个包含4个辅助角色的Cloud Service部署,其中一个角色启用了自动扩展.一旦发生自动缩放,所有角色的所有实例都将进行回收.

理想情况下,我想停止回收角色,或者至少以受控方式终止所有其他角色的工作.

我发现,您可以对RoleEnvironment.Changing事件做出反应并取消它以请求正常关闭(即调用OnStop).但是,通过向Changing事件处理程序添加跟踪输出,我注意到Changing事件显然甚至没有被触发,因此取消也没有被注册.

private void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e)
{
    // This tracing output does not show up in the logs table.
    Trace.TraceInformation("RoleEnvironmentChanging event fired.");
    if ((e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange)))
    {
        // This one neither.
        Trace.TraceInformation("One of the changes is a RoleEnvironmentConfigurationSettingChange. Cancelling..");

        e.Cancel = true;
    }
    if ((e.Changes.Any(change => change is RoleEnvironmentTopologyChange)))
    {
        // This one neither.
        Trace.TraceInformation("One of the changes is a RoleEnvironmentTopologyChange. Cancelling.");

        e.Cancel = true;
    }
}

public override bool OnStart()
{ …
Run Code Online (Sandbox Code Playgroud)

.net c# azure azure-worker-roles azure-cloud-services

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

MS VisualStudio 2012中的ShimNotSupportedException

我只是想熟悉Visual Studio 2012 RC中新的Fakes Isolation Framework,但我因此面临着ShimNotSupportedExceptions的问题.
在第一次尝试时,我尝试连接一个委托的每个单一的shim方法,ShimNotSupportedException在尝试运行/调试测试时抛出了一个.

[TestMethod]
public void GetFoo_ValidBar_ReturnsBaz()
{
    using(ShimsContext.Create())
    {
        ShimDateTime.NowGet = () => new DateTime(2012,08,11,10,20,59);

        const string expected = "20120811_102059";
        string actual = GetFoo();

        Assert.AreEqual(expected,actual);
    }
} 
Run Code Online (Sandbox Code Playgroud)

这是相应的堆栈跟踪:

GetFoo_ValidBar_ReturnsBaz测试方法抛出了一个异常:Microsoft.QualityTools.Testing.Fakes.Shims.ShimNotSupportedException:System.DateTime,位于Microsoft.QualityTools的Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.InvokeEvent(T值,Action1 eh). Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.InternalAttachDetour(Object optionalReceiver,MethodBase)中的Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.CheckInstrumentation(MethodBase方法)中的Testing.Fakes.UnitsTestIsolation.UnitTestIsolationRuntime.OnAttachedUnsupportedMethod(MethodBase方法)方法,委托detourDelegate)Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.AttachDetour(Object optionalReceiver,MethodBase方法,Delegate detourDelegate)在Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime.SetShimMethod(Delegate optionalStub,Object optionalReceiver, MethodBase方法)在Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime的Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime.SetShim(Delegate optionalStub,Type receiverType,Object optionalReceiver,String name,ShimBinding flags,Type returnType,Type [] parameterTypes) .SetShimPublicStatic(Delegate optionalStub,Type receiverType,String name,Type returnType,Type [] parameterTypes)在BazTests.cs的GetFoo_ValidBar_ReturnsBaz()的System.Fakes.ShimDateTime.set_NowGet(Func'1值):第48行.

在阅读了我在MSDN上找到的两个线程处理这个问题后,我按照他们的指示(关闭CodeCoverage,删除.testsettings文件)这对我不起作用!
不过我找到了解决这个问题的方法:
首先从测试资源管理器运行所有测试(而不是直接在编码区域外使用"MSTest测试(点击运行)"按钮)一切正常,没有抛出任何异常.之后我甚至可以调试测试,并且对shim方法的赋值也按预期工作.
这适用于我使用的所有后续垫片.
但是,当我尝试实现MS Enterprise Library的伪造数据库访问时,我又遇到了同样的问题.

这是测试的样子:

[TestMethod]
public void GetFooFromEF_NonEmptyDataReader_ObjectsCorrectlyInstantiated()
{
    using(ShimsContext.Create()){
        var dataReader = new StubIDataReader() …
Run Code Online (Sandbox Code Playgroud)

c# shim isolation visual-studio microsoft-fakes

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

Entity Framework 5.0继承多个程序集

我正在使用Entity Framework 5.0,其中包含代码优先方法以及由Table Per Hierarchy表示的业务对象的继承.

我想要有以下结构:

//Assembly 'DataAccess'    
public class MyDbContext : DbContext
{
    DbSet<AbstractClass> CommonObjects.AbstractClasses { get; set; }
}

//Assembly 'CommonObjects'  
public abstract class AbstractClass
{
    //implementation
}

//Assembly 'DerivedObjects'   
public class DerivedClass : AbstractClass
{
    //implementation
}
Run Code Online (Sandbox Code Playgroud)

在运行时,第一次尝试访问DbContext时,编译器会抛出InvalidOperationException:

抽象类型"CommonObjects.AbstractClass"没有映射的后代,因此无法映射.从模型中删除"CommonObjects.AbstractClass",或者将从"CommonObjects.AbstractClass"派生的一个或多个类型添加到模型中.

这种情况甚至可能吗?如果是的话,我做错了什么?

感谢您提前的答案.

附加信息:

也许我应该更具体一点:

我有一个包含我的抽象业务对象的程序集(只有抽象).具体实现(包含逻辑)保存在负责的程序集中,因为它们的逻辑依赖于该程序集中的其他类.问题是,我希望能够在persistance层中存储这些conrete实现.但为此目的,EF必须知道这些类型才能实现映射.但我不想让持久层依赖于我的业务逻辑层 - 只有抽象.

这就是我尝试直接从业务对象层将派生对象添加到DbContext的原因.

例:

AbstractClass derivedClass = new DerivedClass();
MyDbContext.AbstractClasses.Add(derivedClass); 
Run Code Online (Sandbox Code Playgroud)

但随后抛出上述例外情况.我只是想不出一个好的结构来实现这一目标.

inheritance entity-framework table-per-hierarchy entity-framework-5

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