我开始开发一个新的MVC应用程序,其中实体框架代码优先,Unity用于依赖注入.我使用EF5和Unity,因为我认为他们应该在Medium Trust中工作.但是,当我把<trust level="Medium" />标记扔进我的时候web.config,我开始获得反射权限异常.
似乎每当我超越使用像System.Data.SqlClientADO.net 这样的内置东西时,我总是会遇到Medium Trust中的问题.自动映射器:失败.NHibernate:失败.MySQL:失败.EF5代码优先:失败.国际奥委会:失败.
我只是在追逐梦想吗?是否有可能使用将在Medium Trust中运行的现代技术来实现构建良好且可测试的Web应用程序?
在虚拟机/虚拟服务器/云计算时代(甚至一些将您的应用程序池设置为完全信任的共享主机),是否有人发现为中型信任开发值得付出努力?
我们目前正在处理一个较旧的项目(ASP.NET Web 窗体网站)并尝试查看是否可以为其设置依赖项注入。
需要强调的是:这不是一个 Web 应用程序项目......它是旧类型的网站。
它目前的目标是 .NET 4.7.2:
<httpRuntime targetFramework="4.7.2" />
Run Code Online (Sandbox Code Playgroud)
到目前为止,我们已经包含了 NuGet 包:
<package id="Microsoft.AspNet.WebFormsDependencyInjection.Unity" version="1.0.0" targetFramework="net472" />
Run Code Online (Sandbox Code Playgroud)
定义了一些虚拟接口和实现:
public interface IDependencyTest
{
string GetName();
}
public class DependencyTest : IDependencyTest
{
public string GetName()
{
return "Mwuhahaha!!!";
}
}
Run Code Online (Sandbox Code Playgroud)
并在 global.asax 中的 Application_Start 事件处理程序中连接 DI 容器:
void Application_Start(object sender, EventArgs e)
{
var container = this.AddUnity();
container.RegisterType<IDependencyTest, DependencyTest>();
}
Run Code Online (Sandbox Code Playgroud)
导入了所需的命名空间:
<%@ Import Namespace="Microsoft.AspNet.WebFormsDependencyInjection.Unity" %>
<%@ Import Namespace="Unity" %>
Run Code Online (Sandbox Code Playgroud)
创建了一个测试页面Teste.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Teste.aspx.cs" Inherits="Teste" %>
<!DOCTYPE …Run Code Online (Sandbox Code Playgroud) 我是Moq和单元测试的新手.我一直在进行单元测试,这是以下代码:
private Mock<IServiceAdapter> repository;
[TestInitialize]
public void Initialize()
{
repository= new Mock<IServiceAdapter>();
}
[TestMethod()]
public void SaveTest()
{
//Setup
string Name = "Name1";
string Type = "1";
string parentID = null;
repository.Setup(x => x.Save(Name , Type, parentID)).Returns("Success").Verifiable();
//Do
var result = repository.Object.Save(Name , Type, parentID);
//Assert
repository.Verify();
}
Run Code Online (Sandbox Code Playgroud)
我的问题是测试将始终返回我放在Returns参数中的字符串,换句话说,它将始终返回"成功"或我在其位置写入的任何内容.我想这不对,因为那不是服务的真实行为.任何人都知道如何反映我正在尝试测试的"保存"服务的真实行为?因此,假设返回字符串与服务方法不同,则测试应该失败.
编辑
ServiceAdapter接口只是Web服务的包装器,我称之为REST服务.这是一个Web表单项目.
我正在做这样的事情
我应该创建类似具有依赖注入的FakeController以使其工作吗?
随着.NET 4.7.2的更改,现在可以在Web窗体中进行构造函数注入.我已经使用简单注入器使用Web窗体,但是想要一些输入,如果有任何"陷阱"我可能会丢失.
首先,我有自己的网页是从拍摄的注册这里.
public static void RegisterWebPages(this Container container)
{
var pageTypes =
from assembly in BuildManager.GetReferencedAssemblies().Cast<Assembly>()
where !assembly.IsDynamic
where !assembly.GlobalAssemblyCache
from type in assembly.GetExportedTypes()
where type.IsSubclassOf(typeof(Page))
where !type.IsAbstract && !type.IsGenericType
select type;
foreach (Type type in pageTypes)
{
var reg = Lifestyle.Transient.CreateRegistration(type, container);
reg.SuppressDiagnosticWarning(
DiagnosticType.DisposableTransientComponent,
"ASP.NET creates and disposes page classes for us.");
container.AddRegistration(type, reg);
}
}
Run Code Online (Sandbox Code Playgroud)
当从上面的链接使用属性注入方法时,这很有效.我把它包括在这里是为了完整.
当我第一次连线时,有OutputCacheModule一个内部构造函数的问题.使用此处的代码,我能够解决该问题以及可能源自内部构造函数的任何其他问题.以下是该实现的完整性代码.
public class InternalConstructorResolutionBehavior : IConstructorResolutionBehavior
{
private IConstructorResolutionBehavior original;
public InternalConstructorResolutionBehavior(Container container)
{
this.original …Run Code Online (Sandbox Code Playgroud) 我倾向于回避向ASP.NET页面添加属性.这对我来说似乎不是一个好主意.但是,最近我看到了一些示例应用中使用的做法.我是否厌恶向页面添加自定义属性是没有根据的还是"这取决于"情况?
asp.net ×4
c# ×4
webforms ×2
.net ×1
asp.net-mvc ×1
interface ×1
medium-trust ×1
moq ×1
properties ×1
unit-testing ×1