在我的asp.net-mvc应用程序中,我有一个调用静态CreateContainer()方法的statis MvcApplication.
在这个方法中,我创建了我的统一ioc容器:
private static IUnityContainer CreateContainer()
{
var container = new UnityContainer();
container.RegisterType<IConfigurationService, ConfigFile>();
container.RegisterType<ILoggerService, NlogLoggerService>();
container.RegisterInstance<ISearchService>(
new LuceneSearchService(
container.Resolve<IConfigurationService>(),
container.Resolve<ILoggerService>()),
new ContainerControlledLifetimeManager());
}
Run Code Online (Sandbox Code Playgroud)
如果我理解我的源代码,这应该给我一个单独的LuceneSearchService实例.然而,在我的日志记录中,我可以看到每次请求此实例时我的构造函数都会被命中.
我究竟做错了什么?
我正在学习Unity依赖注入容器,我总是看到很多像这样的代码:
using (IUnityContainer container = new UnityContainer())
{
container
.RegisterType<IView, Form>()
.RegisterType<IService, Service>(
new InjectionProperty("Logger")
)
.RegisterType<ILogger, ConsoleLogger>()
.RegisterType<ILogger, Logger>("UI")
.RegisterInstance(new TraceSource("UI", SourceLevels.All))
.RegisterType<Presenter>(
new InjectionProperty("Logger",
new ResolvedParameter<ILogger>("UI")
)
);
Presenter presenter = container.Resolve<Presenter>();
//do stuff with presenter
}
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么电话会被锁定?IE为什么以上不能写成如下:
using (IUnityContainer container = new UnityContainer())
{
container.RegisterType<IView, Form>();
container.RegisterType<IService, Service>(
new InjectionProperty("Logger")
);
container.RegisterType<ILogger, ConsoleLogger>();
container.RegisterType<ILogger, Logger>("UI");
container.RegisterInstance(new TraceSource("UI", SourceLevels.All));
container.RegisterType<Presenter>(
new InjectionProperty("Logger",
new ResolvedParameter<ILogger>("UI")
)
);
Presenter presenter = container.Resolve<Presenter>();
//do stuff with presenter
}
Run Code Online (Sandbox Code Playgroud)
或者这纯粹是一种风格?
我正在努力开始团结,我正在寻找这个特殊问题的帮助:我已经了解了依赖注入/统一是什么以及如何以编程方式执行此操作但我不明白当成员填充时如何/何时填充标有Dependency-Attribute.
class Program
{
static Program()
{
uContainer = new UnityContainer();
var section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
section.Configure(uContainer);
}
private static IUnityContainer uContainer;
[InjectionMethod]
public static void InjectTrace(ITraceManager traceManager)
{
trace = traceManager;
}
[Dependency]
public static ITraceManager trace { get; set; }// = /*new WebTraceManager("C:\\","trace",true);//*/new EnterpriseLibaryLoggingWrapper(false);
static void Main(string[] args)
{
//Programmatically inject dependency
// TODO: Do this via attributes
//UnityContainer myContainer = new UnityContainer();
//UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
//section.Containers["containerOne"].Configure(myContainer);
//trace = myContainer.Resolve<ITraceManager>();
trace.ProgramStatus("Start");
trace.ProgramStatus("End");
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
Main中以编程方式设置trace属性的未注释部分工作正常.但是使用属性"Dependency"将不会填充该属性.是否缺少对统一容器的调用?谢谢您的帮助.
根据Steve的建议,我改变了示例,使用实例而不是静态类:
static …Run Code Online (Sandbox Code Playgroud) 我有一个大班级.当我的应用程序启动时,我初始化UnityContainer对象并进行配置.之后,我总是将它通过构造函数传递给层次结构中的另一个类.像这样的东西:
Unity容器将这些类作为注册:IClassA,IClassB,IClassC,IClassD
接口的所有具体实现都具有带IUnityContainer参数的构造函数.例如,
public class ClassA : IClassA
{
public ClassA(IUnityContainer unityContainer)
{
}
}
Run Code Online (Sandbox Code Playgroud)
因此,每当我创建某个类的新实例时,我必须传递IUnityContainer的对象.
我可以减少传递IUnityContainer对象的数量作为构造函数的参数吗?也许通过使用Dependency属性?
.net c# dependency-injection inversion-of-control unity-container
我们有一个MVC3控制器,其中有一些"常见"工作,我们已经进入控制器构造函数.一些常见的工作是由一个失败耦合的类(比如说ourService)通过Unity动态解决(对于IoC /依赖注入).ourService在Controller的构造函数中为null(即未解析)但它在通常的Controller方法中正确解析.下面的简单演示代码显示了问题:
public class Testing123Controller : BaseController
{
[Dependency]
public IOurService ourService { get; set; }
public Testing123Controller()
{
ourService.SomeWork(1); // ourService=null here !!
...
}
public ActionResult Index()
{
ourService.SomeWork(1); // resolved properly here here !!
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
问题:
我们设置Unity 2.0的方式是:
Global.asax中
Application_Start()
{
...
Container = new UnityContainer();
UnityBootstrapper.ConfigureContainer(Container);
DependencyResolver.SetResolver(new UnityDependencyResolver(Container));
...
}
public static void ConfigureContainer(UnityContainer container)
{
...
container.RegisterType<IOurService, OurService>();
...
}
Run Code Online (Sandbox Code Playgroud)
IOurService.cs
public interface IOurService
{ …Run Code Online (Sandbox Code Playgroud) 我正在使用Unity IoC框架,并Bootstrapper.cs在我的主机MVC层中有一个类来注册所有组件.然而,在我的建筑我有MVC层下方的"服务"层,即也使用DI并有库接口注入到它(库接口未在MVC层使用-它注入到其控制器的服务层接口) .
所以我的问题如下:我是否仍然可以将存储库接口注册到整个应用程序的MVC/UI层中的具体类型,或者我是否添加对Unity的另一个引用并Bootstrapper.cs在我的"服务"层中创建另一个类来定义接口特定图层使用的类型?
即使答案是我可以在UI层注册界面,我仍然想知道常见的做法.我不喜欢在MVC/UI层中注册该类型的事情是我必须添加对Repository层的引用才能进行注册,甚至知道它不在该层中使用.它用在服务层中.
谢谢!
你好:)我是一个使用Moq框架和Unit的新手,我有一个问题,正如我将在下面演示的那样,我正在尝试Moq对MVC控制器进行服务调用,它将Session对象作为参数.在我的单元测试框架中,我创建了我的对象,在服务调用上设置它,我希望将它作为测试响应然后断言的结果.
问题:我尝试基于其他解决方案模拟HttpContext,这是因为在Controller端我得到了我在单元测试中设置的值,但是在设置服务调用时(我有"Mock(MockBehavior.Strict);")当调试器到达控制器时,在实际调用时,我得到一个错误,说没有定义SETUP.或者,如果我取出"MockBehavior.Strict",控制器上的"model"变量总是返回null,而不是我在Unit Test类上设置它的对象.
所以这是我的简单单元类,
[TestClass]
public class SearchControllerTest
{
#region Variables
Mock<ControllerContext> _controllerContext;
Mock<ISearchService> _serviceMock;
SearchController _controller;
#endregion
[TestInitialize]
public void SetUp()
{
// Arrange
_controllerContext = new Mock<ControllerContext>();
_serviceMock = new Mock<ISearchService>(MockBehavior.Strict);
_controller = new SearchController(_serviceMock.Object);
}
#region Success Test Cases
[TestMethod]
public void SearchListTest()
{
string pid = "val1";
string oid = "val2";
string lang = "val3";
string tid = "val4";
string pattern = "val5";
DocumentViewModel docModel = SetDocumentViewModel();
// Bypass
//_controllerContext.Setup(x => x.HttpContext.Session).Returns(_session.Object);
_controllerContext.SetupGet(p => p.HttpContext.Session["ProjectId"]).Returns("X");
_controllerContext.SetupGet(p …Run Code Online (Sandbox Code Playgroud) 我在asp.net MVC 4中使用Unity.Mvc4并且内置Bootstrapper文件来注册所有类型,如下所示.
public static class Bootstrapper
{
public static IUnityContainer Initialise()
{
var container = BuildUnityContainer();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
return container;
}
-----------------------
------------------------
Run Code Online (Sandbox Code Playgroud)
在我的Controller构造函数中,我正在注入IUnityContainer本身以按需调用Resolve(),如下所示
private IQuestionBusinessLogic _qstnBL;
public MyController(IUnityContainer unityContainer)
: base(unityContainer)
{
qstnBL = _unityContainer.Resolve<IQuestionBusinessLogic>();
}
Run Code Online (Sandbox Code Playgroud)
查询是
asp.net-mvc dependency-injection unity-container asp.net-mvc-4
我正在尝试将WebAPI添加到现有的ASP.Net MVC项目中,我的问题是关于Unity:
在单独使用UnityMVC之前,该项目在App_Start文件夹中具有UnityConfig类,其代码如下:
container.RegisterType<IUnitOfWork, UnitOfWork>(new PerRequestLifetimeManager());
container.RegisterType<IDataContext, tfe_schemaContext>(new PerRequestLifetimeManager());
container.RegisterType<IPrintJobService, PrintJobService>(new PerRequestLifetimeManager());
container.RegisterType<IRepository<print_job>, Repository<print_job>>(new PerRequestLifetimeManager());
Run Code Online (Sandbox Code Playgroud)
为了使用WebAPI,我通过NuGet添加了UnityWebAPI,这个动作在App_Start文件夹中添加了UnityMvcActivator类.
执行项目时显示以下错误:"类型Unity.WebApi.UnityDependencyResolver似乎未实现Microsoft.Practices.ServiceLocation.IServiceLocator.参数名称:commonServiceLocator".
我使用Bootstrapper类找到了不同的代码示例,但没有使用UnityConfig类或UnityMvcActivator.
在Bootrstrapper类中,类型的注册是这样的:
container.RegisterType<IProductServices, ProductServices>().RegisterType<UnitOfWork>(new HierarchicalLifetimeManager());
Run Code Online (Sandbox Code Playgroud)
我对这一切有点失落,请帮助我理解并修复此错误.
快速依赖注入/ IoC容器问题,对于经验丰富的开发人员来说,将是一个简单的问题。我是DI的新手,并且掌握了使用类型构造函数注入来注册类型并解析它们以构建实例的过程的基础知识,但是对于用数据加载其实例的过程以及何时何地正确执行操作有疑问。
因此,如果您有一个已解决的问题,可以使用DI容器构建该对象-它会加载一个空心对象,但是您打算在什么时候使用所需的数据来加载该对象?
例如:如果您有一个由Student类和Principal类实现的IPerson接口。并且您有一个由SiteVisit实现的ISiteVisit接口,并以以下方式解析:
var dictr = new UnityContainer();
dictr.RegisterType<IPerson, Principal>();
dictr.RegisterType<IVisitSite, SiteVisit>();
var siteVisit = dictr.Resolve<IVisitSite>();
siteVisit.Visit();
Run Code Online (Sandbox Code Playgroud)
您将在何处加载Person的详细信息(在示例类中是:Principal)以获取诸如FirstName,LastName,PhoneNumber,Address等数据。-与Person相关的任何内容?是否将其加载到构造函数中,如果不是,最好的加载位置,最佳约定和/或最佳实践是什么?
您是否应该在应用程序中的每个接口或某些模型上理想地使用依赖注入?
使用依赖注入时如何将数据加载到解析的对象中?
环境:Visual Studio 2015,C#,Unity for DI /容器(使用控制台应用程序对此进行测试)