- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们目前正在处理一个较旧的项目(ASP.NET Web 表单网站),并尝试看看是否可以为其设置依赖项注入(inject)。
需要强调:这不是一个 Web 应用程序项目...它是较旧的类型,即网站。
它目前面向 .NET 4.7.2:
<httpRuntime targetFramework="4.7.2" />
到目前为止,我们已经包含了 NuGet 包:
<package id="Microsoft.AspNet.WebFormsDependencyInjection.Unity" version="1.0.0" targetFramework="net472" />
定义了一些虚拟接口(interface)和实现:
public interface IDependencyTest
{
string GetName();
}
public class DependencyTest : IDependencyTest
{
public string GetName()
{
return "Mwuhahaha!!!";
}
}
并在 global.asax 的 Application_Start 事件处理程序中连接 DI 容器:
void Application_Start(object sender, EventArgs e)
{
var container = this.AddUnity();
container.RegisterType<IDependencyTest, DependencyTest>();
}
已导入所需的命名空间:
<%@ Import Namespace="Microsoft.AspNet.WebFormsDependencyInjection.Unity" %>
<%@ Import Namespace="Unity" %>
创建了测试页面Teste.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Teste.aspx.cs" Inherits="Teste" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="lblDisplay" runat="server" Text="No luck..."></asp:Label>
</div>
</form>
</body>
</html>
后面的代码如下:
public partial class Teste : System.Web.UI.Page
{
private IDependencyTest _dependencyTest;
public Teste(IDependencyTest dependencyTest)
{
_dependencyTest = dependencyTest;
}
protected void Page_Load(object sender, EventArgs e)
{
lblDisplay.Text = _dependencyTest.GetName();
}
}
所有这些设置都将失败,但有以下异常(exception):
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\7a04dd72\81815e95\App_Web_teste.aspx.cdcab7d2.rtms4_ja.0.cs(187): error CS7036: There is no argument given that corresponds to the required formal parameter 'dependencyTest' of 'Teste.Teste(IDependencyTest)'
但是,属性注入(inject)确实有效:
using Unity.Attributes;
public partial class Teste : System.Web.UI.Page
{
[Dependency]
public IDependencyTest DependencyTest { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
lblDisplay.Text = DependencyTest.GetName();
}
}
说实话,我真的很想使用构造函数注入(inject)...
为什么它不适合我们当前的设置?
是因为它是 ASP.NET 网站而不是 ASP.NET Web 应用程序吗?
可以采取什么措施让它在这里工作吗?
最佳答案
为什么它不适合我们当前的设置?
Asp.Net WebForms 的默认配置 System.Web.UI.Page 需要一个无参数构造函数来实例化您的页面并启动 Page Life Cycle 。
这就是在尝试使用构造函数依赖注入(inject)时收到此错误的原因。
error CS7036: There is no argument given that corresponds to the required formal parameter 'dependencyTest' of 'Teste.Teste(IDependencyTest)'
<小时/>
可以采取什么措施让它在这里也正常工作吗?
在 WebForms 的黄金时代,Asp.Net WebForms 的依赖注入(inject) (DI) 并不常见,因此很难在官方文档中找到相关内容。
在 StackOverflow 和 Google 上进行一些搜索后,我发现了一些有用的信息,可以帮助您解决问题。
<小时/>直到 4.7.2 版本之前,Asp.Net WebForms 才很好地支持 DI
因此,如果您使用的版本低于 4.7.2,并且无法更新到较新的版本,则需要使用 PageHandlerFactory
。由于我从未尝试过此操作,因此我更愿意为您提供我找到的两个引用文献的链接。
Dependency Injection in ASP.NET Web Forms
<小时/>如果您使用的版本高于 4.7.2,或者您可以更改为此版本。您可以使用对 DI 有更好支持的 WebForms。
Step 1 – Implement IServiceProvider. You can implement your own DI logic in it or plug in another DI framework, e.g. Unity, Ninject. The following example demonstrates injecting an ILog object through the constructor.
public class SimpleActivator : IServiceProvider
{
public object GetService(Type serviceType)
{
var ctors = serviceType.GetConstructors();
ConstructorInfo targetCtor = null;
foreach (var c in ctors)
{
var parameters = c.GetParameters();
if (parameters.Count() == 1 && parameters[0].ParameterType == typeof(ILog))
{
targetCtor = c;
break;
}
}
if(targetCtor != null)
{
return targetCtor.Invoke(new object[] { new DebuggingLoger() });
}
else
{
return Activator.CreateInstance(
serviceType,
BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.CreateInstance,
null,
null,
null);
}
}
}
Step 2 – Set WebObjectActivator in Global.asax.
public class Global : System.Web.HttpApplication
{
public override void Init()
{
HttpRuntime.WebObjectActivator = new SimpleActivator();
base.Init();
}
}
Step 3 – Use Dependency Injection in your Webform page.
public partial class WebForm2 : System.Web.UI.Page
{
private ILog _log;
public WebForm2(ILog l)
{
_log = l;
}
}
您可以在此链接中查看此示例以及更多有关它的信息:https://devblogs.microsoft.com/dotnet/announcing-the-net-framework-4-7-2/
<小时/>在我看来,如果您可以迁移到较新版本的 .NetFramework,您应该尝试实现 IServiceProvider
。如果不能,那么您应该分析 PageHandlerFactory
的实现是否会在将来为您节省比实现它所花费的时间更多的时间。如果它在将来不能节省您的时间,您可以继续使用 [Dependency]
属性注入(inject)。
关于c# - .NET 4.7.2 ASP.NET WebForms 网站中的依赖注入(inject) - 构造函数注入(inject)不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59177252/
我有这个网站,这个特定页面是安全的,但是当它回发时,它回发到一个不安全的页面。如何解决? 我正在使用 ASP.NET 向导。我有这个页面 - checkout.aspx,页面包含这个控件 checko
我有 2 个 azure 网站 - 两个独立的项目 我现在有 2 个网址: myazurewebsite.azurewebsites.net myazureblog.azurewebsites.net
我有 2 个 azure 网站 - 两个独立的项目 我现在有 2 个网址: myazurewebsite.azurewebsites.net myazureblog.azurewebsites.net
环境: 旧网站: React 托管在 Heroku URL( http://sameurl.com ) 新网站: Java 托管在 Heroku URL ( http://sameurl.com )
我已在 Windows Azure 上注册了一个测试帐户来对其进行测试。我构建了一个 Hello world ASP.NET Web 应用程序 + 数据库只是为了测试。 我安装了 Visual Stu
我有一个可以收集和显示各种测量值的产品(不会详细介绍)。正如人们所期望的那样,显示部分是一个数据库+建立在其之上的网站(使用 Symfony)。 但是,我们可能还会创建一个 API 来向第三方公开数据
这个问题在这里已经有了答案: Software keyboard resizes background image on Android (16 个答案) 关闭 8 年前。 我有一个类似的问题:So
这个问题似乎很常见,但我真的无法根据现有答案解决问题。 我有一个简单的 maven 项目,没有任何复杂的部署配置等,并且想在点击“mvn site”时生成一个 Maven CheckStyle 报告。
有没有人看过有关何时进行横向扩展与纵向扩展的最佳选择的任何分析或信息。什么时候一个比另一个更有意义。 目前,在标准模式和基本模式下,2 个小型实例的费用与 1 个中型实例的费用相同。 拥有 2 个小型
有没有办法找到 azure 网站何时停止? (我通过门户网站停止了网站,但我不记得是什么时候......) 我正在寻找一些日志,但没有找到任何有用的内容。 谢谢。 最佳答案 您拥有的最接近的是 azu
我目前在 Azure VM 的 IIS 中拥有一个网站。我已将该站点复制到 2 个可用区域中的 2 个虚拟机上。 这可以保护网站免遭停机。 我需要为高负载时刻实现一些可扩展性。这似乎就是创建音阶集的目
我有一个托管在 Azure 上的网站 ( http://mike-ward.azurewebsites.net/ )。我从 Azure 门户设置了一个指向(引用?)我的网站的 Azure CDN。根据
我有一个 Azure 网站(不是 Web 角色),有 2 个槽:生产和暂存。 我只想为生产插槽启用 CDN,而不是为登台启用,问题是我找不到识别主机插槽的方法。 RoleEnvironment 不可用
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等建议的问题。您可以编辑问题,以便可以用事实和引用来回答它。 4年前关
我们正在考虑将一些网站从 Azure 云服务迁移到 Azure 网站(事情似乎就是这样进行的)。显然,我们被明确告知云服务不会保留文件系统状态,因为它们会在机器故障时重新部署。 我假设网站是基于 Bl
我有一个 Azure 网站,需要使用在 VM 上运行的 Elasticsearch 服务。 虽然我需要能够锁定对 Elasticsearch 的访问,以便只有 Azure 网站可以访问它,但我似乎无法
我有一个 azure 网站,位于 yis3.azurewebsites.net - 我已将其提升为“共享”网站,以便我可以使用自定义域。我拥有从 123-reg.co.uk 购买的域名 yorkshi
我正在使用 abcPDF 动态创建 PDF。 我想保存这些 PDF,以便客户随时检索。最简单的方法(也是我现在在当前服务器上所做的方法)是将完成的 PDF 保存到文件系统。 看来我一直坚持使用 blo
我们正在尝试了解 Windows Azure 管理 API 为 Azure 网站(而非 Webroles)返回的监控数据的复杂性 例如,下图描述了为 CPUTime 检索的数据点。它似乎表明,在晚上
看起来真的很愚蠢,因为我找不到它: 门户网站似乎不太直观,我如何为一个“网站”付费并在其中运行最多 500 个网站?我想当我通过单击左下角的加号添加“网站”时,我添加了整个虚拟机而不是子站点。如何仅添
我是一名优秀的程序员,十分优秀!