使用Unity.Mvc3实现依赖注入简介

15 篇文章 0 订阅

开始使用Unity.Mvc3

本文一步一步演示如何在MVC3项目中使用Unity.Mvc3实现依赖注入。

先创建一个基本的MVC3项目。

The Visual Studio 2010 New Project Dialog

Figure 1: The Visual Studio 2010 New Project Dialog

The ASP.NET MVC3 Internet Application Template

Figure 2: The Visual Studio 2010 New ASP.NET MVC3 Internet Application Template

通过NuGet将Unity.Mvc3加入到项目。.右击references选择Manage NuGet packages.。在弹出对话框 输入Unity.Mvc3 搜索。. 在搜索结果中选择Unity.Mvc3 安装。

Manage NuGet Packages Context Menu Item

Figure 3: Manage NuGet Packages Context Menu Item

 

Manage NuGet Packages Dialog

Figure 4: Manage NuGet Packages Dialog

NuGet将安装Unity 和Unity.Mvc3并添加到引用,同时在项目中添加一些文件。 Bootstrapper.cs包含初始化Unity容器和DependencyResolver的代码。

using System.Web.Mvc;
using Microsoft.Practices.Unity;
using Unity.Mvc3;
namespace MvcApplication1
{
public static class Bootstrapper
{
public static void Initialise()
{
var container = BuildUnityContainer();
DependencyResolver.SetResolver( new UnityDependencyResolver(container));
}
private static IUnityContainer BuildUnityContainer()
{
var container = new UnityContainer();
// register all your components with the container here
// e.g. container.RegisterType<ITestService, TestService>();
return container;
}
}
}

在Global.asax 的Application_Start 方法中添加对Bootstrapper初始化方法的调用。

protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
Bootstrapper.Initialise();
}

 :-)

添加依赖

这里以一个简单的消息service为例,演示如何通过unity.Mvc3实现依赖注入。添加IMessageService接口和实现了此接口的MessageService。

namespace MvcApplication1
{
public interface IMessageService
{
string GetMessage();
}
public class MessageService : IMessageService
{
public string GetMessage()
{
return "Hello from the MessageService" ;
}
}
}

修改HomeController,在HomeController中使用ImessageService。

using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
public class HomeController : Controller
{
private readonly IMessageService _messageService;
public HomeController(IMessageService messageService)
{
_messageService = messageService;
}
public ActionResult Index()
{
ViewBag.Message = _messageService.GetMessage();
return View();
}
public ActionResult About()
{
return View();
}
}
}

最后,告诉unity我们的服务类 MessageService。在Bootstrapper类的BuildUnityContainer 方法中使用RegisterType<TFrom, TTo>注册我们的接口和实现,完成接口和实现的Map。.

private static IUnityContainer BuildUnityContainer()
{
var container = new UnityContainer();
container.RegisterType<IMessageService, MessageService>();
return container;
}

运行效果如下图所示。 MVC framework 告知DependencyResolver返回一个 HomeController。Resolver通过Unity 获知 HomeController 需要一个明确的IMessageService接口实现。由于在初始化时注册了IMessageService接口和实现的Map, Unity 将实例化一个MessageService对象,注入到控制器中,返回给MVC framework。由此完成了依赖注入。

 MVC View Displaying The Message Created By The The MessageService

Figure 5: MVC View Displaying The Message Created By The The MessageService

添加依赖的依赖

增加一点复杂度。假设MessageService本事也有依赖,创建一个IMessageGenerator接口和实现.

namespace MvcApplication1
{
public interface IMessageGenerator
{
string GetMessage();
}
public class MessageGenerator : IMessageGenerator
{
public string GetMessage()
{
return "消息来自MessageGenerator" ;
}
}
}

修改MessageService:.

public class MessageService : IMessageService
{
private readonly IMessageGenerator _messageGenerator;
public MessageService(IMessageGenerator messageGenerator)
{
_messageGenerator = messageGenerator;
}
public string GetMessage()
{
return string .Concat("通过MessageService,",_messageGenerator.GetMessage() );
}
}

同样,将新的组件注册到Unity:

container
.RegisterType<IMessageService, MessageService>()
.RegisterType<IMessageGenerator, MessageGenerator>();

运行结果如图6所示。

MVC View Displaying The Message Created By The The MessageService And MessageGenerator

Figure 6: MVC View Displaying The Message Created By The The MessageService And MessageGenerator

IDisposable依赖

最后,我们演示实现 IDisposable的依赖。. 无论使用NHibernate, Entity Framework 或者 LINQ to SQL, 必须在request之后释放context/session 。这里演示如何通过Unity.Mvc3释放对象。

using System;
using System.Diagnostics;
namespace MvcApplication1
{
public interface IMessageGenerator
{
string GetMessage();
}
public class MessageGenerator : IMessageGenerator, IDisposable
{
public string GetMessage()
{
return "Hello from the MessageGenerator" ;
}
public void Dispose()
{
Debug.WriteLine( "Message Generator is being disposed" );
}
}
}

在注册时使用HierarchicalLifetimeManager告知dependency resolver。

container
.RegisterType<IMessageService, MessageService>()
.RegisterType<IMessageGenerator, MessageGenerator>( new HierarchicalLifetimeManager());

演示结果如下:

Output Window Showing Message When MessageGenerator Is Disposed

Figure 7: Output Window Showing Message When MessageGenerator Is Disposed

结论

Unity.Mvc 安装时,如果之前没有安装Unity,将自动安装。.Bootstrapper文件自动加入到项目中,以减少开发者使用Unity.Mvc3的步骤。

 

译注:安装也可通过Package Manager Console使用Install-Package Unity.Mvc3命令安装。

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值