我们有一个enterpise Web应用程序,它由4个编译组件(DLL)组成.一年多以前,我们开始实现更细粒度的组件,以试图隔离功能,减少耦合并降低重新编译和部署大量代码的风险.虽然没有人认为这种方法在添加新功能和修补错误时为我们提供了更多灵活性和上市速度,但现在应用程序包含近40个dll.我们有一个命名约定,可以很好地识别我们的组件.
我的问题是:有多个dll的应用程序是否存在任何漏洞(性能,维护等)?
编辑:我们正在探索将代码重构为更大的组件的选项,我认为这可能是各种各样的回归......
我需要更改.NET DLL的代码.我可以通过使用.NET反射器编译DLL来查看代码,但我无法更改DLL的代码.使用.NET Reflector,我反编译代码并保存到我的硬盘中,但是当我能够重新编译代码时,它会给出错误.
很少有代码以二进制格式反编译,很少有代码用c#反编译.是否有任何工具可以更改和重新编译DLL?
以下是我用来尝试反编译DLL的工具:
不幸的是,没有一个工具能够提供完美的源代码来重新编译DLL代码.
该RuntimeHelpers.GetHashCode(object)
方法允许基于对象的身份生成哈希码.MSDN 声明:
RuntimeHelpers.GetHashCode方法始终非虚拟地调用Object.GetHashCode方法,即使对象的类型已重写Object.GetHashCode方法.
[MethodImpl(MethodImplOptions.InternalCall)]
[SecuritySafeCritical]
public static extern int GetHashCode(object o);
Run Code Online (Sandbox Code Playgroud)
但是,在Object.GetHashCode()
使用Reflector(.NET 4.0)检查方法时,我们将看到以下代码:
public virtual int GetHashCode()
{
return RuntimeHelpers.GetHashCode(this);
}
Run Code Online (Sandbox Code Playgroud)
这让我相信MSDN文档是错误的,因为Object.GetHashCode
从内部调用RuntimeHelpers.GetHashCode(object)
会导致堆栈溢出.
那么它的实际行为是什么RuntimeHelpers.GetHashCode(object)
以及它是如何工作的?它是如何计算哈希值的?
我正在尝试将一个可怕的WCF服务重构为更易于管理的东西.在编写本文时,该服务通过构造函数大约需要9个依赖项,这使得单元测试变得非常困难.
该服务通过状态机处理本地状态,对参数进行验证,抛出故障异常,执行实际操作并通过发布/子通道触发发布事件.所有其他服务调用的代码非常相似.
我意识到我可以通过面向方面编程或WCF行为以不同方式完成其中的几个(参数验证,发布/订阅通知),但我的直觉告诉我一般方法是错误的 - 这感觉太"程序化" .
我的目标是将实际操作的执行与发布/子通知之类的内容分开,甚至可能将错误处理分开.
我想知道像DDD或CQRS或其他技术的首字母缩略词是否可以帮到这里?遗憾的是,我不熟悉定义之外的那些概念.
这是一个这样的WCF操作的(简化)示例:
public void DoSomething(DoSomethingData data)
{
if (!_stateMachine.CanFire(MyEvents.StartProcessing))
{
throw new FaultException(...);
}
if (!ValidateArgument(data))
{
throw new FaultException(...);
}
var transitionResult =
_stateMachine.Fire(MyEvents.StartProcessing);
if (!transitionResult.Accepted)
{
throw new FaultException(...);
}
try
{
// does the actual something
DoSomethingInternal(data);
_publicationChannel.StatusUpdate(new Info
{
Status = transitionResult.NewState
});
}
catch (FaultException<MyError> faultException)
{
if (faultException.Detail.ErrorType ==
MyErrorTypes.EngineIsOffline)
{
TryFireEvent(MyServiceEvent.Error,
faultException.Detail);
}
throw;
}
}
Run Code Online (Sandbox Code Playgroud) 当我在IIS中设置Windows身份验证启用和匿名禁用时,我收到以下错误.
主机上配置的身份验证方案('IntegratedWindowsAuthentication')不允许在绑定'BasicHttpBinding'('Anonymous')上配置的身份验证方案.请确保将SecurityMode设置为Transport或TransportCredentialOnly.此外,可以通过IIS管理工具,通过ServiceHost.Authentication.AuthenticationSchemes属性,在元素的应用程序配置文件中更改此应用程序的身份验证方案,通过更新绑定上的ClientCredentialType属性,或通过调整HttpTransportBindingElement上的AuthenticationScheme属性.
我的Wcf服务的web.config如下......
<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5"/>
</system.web>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpEndpointBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint binding="basicHttpBinding"
bindingConfiguration="BasicHttpEndpointBinding"
contract="Test.IService1" name="BasicHttpEndpoint" />
</client>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceAuthenticationManager
authenticationSchemes="IntegratedWindowsAuthentication"/>
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="false"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<protocolMapping>
<add binding="basicHttpBinding" scheme="http" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<directoryBrowse enabled="true"/>
</system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)
请指教..
这可能是基本问题
要在多线程环境中使用单例,我们可以使用锁.请参阅代码段.但为什么我们需要在单件模式中进行双重检查锁定?更多的双重锁定意味着什么?
class singleton
{
private static singleton instance = null;
private static singleton() { }
private static object objectlock = new object();
public static singleton Instance
{
get
{
lock (objectlock) //single - check lock
{
if (instance == null)
{
instance = new singleton();
}
return instance;
}
}
}
}
Run Code Online (Sandbox Code Playgroud) System.Type
包含一个UnderlyingSystemType
属性.Msdn 表示:
指示表示此类型的公共语言运行库提供的类型.
在大多数情况下,此属性只返回当前Type
实例.
我的问题是,在什么情况下这个属性不会返回当前Type
实例本身.在这些情况下,当前Type
实例和返回的底层系统类型将是什么类型?
该System.Type
类型包含属性IsGenericTypeDefinition和ContainsGenericParameters.阅读完MSDN文档后,我得出结论,两个属性都存在,以检查类型是开放类型还是封闭类型.
但是,我没有看到两者之间的区别,以及何时想要使用另一个.
我对WithConstructorArgument的理解可能是错误的,因为以下内容不起作用:
我有一个服务,让我们称之为MyService,其构造函数采用多个对象,以及一个名为testEmail的字符串参数.对于此字符串参数,我添加了以下Ninject绑定:
string testEmail = "test@example.com";
kernel.Bind<IMyService>().To<MyService>().WithConstructorArgument("testEmail", testEmail);
Run Code Online (Sandbox Code Playgroud)
但是,在执行以下代码行时,我得到一个异常:
var myService = kernel.Get<MyService>();
Run Code Online (Sandbox Code Playgroud)
这是我得到的例外:
激活字符串时出错没有匹配的绑定可用,并且该类型不可自我绑定.激活路径:
2)将依赖字符串注入到MyService类型的构造函数的参数testEmail中
1)请求MyService建议:
1)确保已为字符串定义了绑定.
2)如果在模块中定义了绑定,请确保已将模块加载到内核中.
3)确保您没有意外创建多个内核.
4)如果使用构造函数参数,请确保参数名称与构造函数参数名称匹配.
5)如果使用自动模块加载,请确保搜索路径和过滤器正确无误.
我在这做错了什么?
更新:
这是MyService构造函数:
[Ninject.Inject]
public MyService(IMyRepository myRepository, IMyEventService myEventService,
IUnitOfWork unitOfWork, ILoggingService log,
IEmailService emailService, IConfigurationManager config,
HttpContextBase httpContext, string testEmail)
{
this.myRepository = myRepository;
this.myEventService = myEventService;
this.unitOfWork = unitOfWork;
this.log = log;
this.emailService = emailService;
this.config = config;
this.httpContext = httpContext;
this.testEmail = testEmail;
}
Run Code Online (Sandbox Code Playgroud)
我有所有构造函数参数类型的标准绑定.只有'string'没有绑定,而HttpContextBase的绑定有点不同:
kernel.Bind<HttpContextBase>().ToMethod(context => new HttpContextWrapper(new HttpContext(new MyHttpRequest("", "", "", …
Run Code Online (Sandbox Code Playgroud) c# dependency-injection exception-handling ninject ninject-2
我有一个项目,其中Ninject用作IoC容器.我担心的是很多类都有这样的构造函数:
[Inject]
public HomeController(
UserManager userManager, RoleManager roleManager, BlahblahManager blahblahManager) {
_userManager = userManager;
_roleManager = roleManager;
_blahblahManager = blahblahManager;
}
Run Code Online (Sandbox Code Playgroud)
如果我不想同时拥有这些类的所有实例,该怎么办?
当所有这些类被包装Lazy<T>
并传递给构造函数的方式并不是我所需要的.该T
实例尚未创建,但Lazy<T>
情况已存储在内存中.
我的同事建议我使用Factory模式控制所有实例,但我不确定IoC是否有这么好的设计错误.
有没有针对这种情况的解决方法,或者IoC在它的设计中确实存在如此大的缺陷?也许我应该使用另一个IoC容器?
有什么建议?
c# ×9
.net ×6
clr ×2
ninject ×2
wcf ×2
asp.net ×1
cqrs ×1
decompiler ×1
dll ×1
generics ×1
iis-7 ×1
ninject-2 ×1
recompile ×1
refactoring ×1
reflection ×1