我试图在我的代码中清理一些可访问性的东西,并无意中破坏了Unity依赖注入.过了一会儿,我意识到我标记了一些我不想在我的DLL之外暴露到内部的公共属性.然后我开始得到例外.
因此,似乎在Unity中使用[Dependency]属性仅适用于公共属性.我认为这是有道理的,因为内部和私人道具对于Unity程序集是不可见的,但是除了Unity之外,拥有一堆你永远不希望任何人设置或能够设置的公共属性感觉真的很脏.
有没有办法让团结也设置内部或私人财产?
这是我希望通过的单元测试.目前只有公共道具测试通过:
[TestFixture]
public class UnityFixture
{
[Test]
public void UnityCanSetPublicDependency()
{
UnityContainer container = new UnityContainer();
container.RegisterType<HasPublicDep, HasPublicDep>();
container.RegisterType<TheDep, TheDep>();
var i = container.Resolve<HasPublicDep>();
Assert.IsNotNull(i);
Assert.IsNotNull(i.dep);
}
[Test]
public void UnityCanSetInternalDependency()
{
UnityContainer container = new UnityContainer();
container.RegisterType<HasInternalDep, HasInternalDep>();
container.RegisterType<TheDep, TheDep>();
var i = container.Resolve<HasInternalDep>();
Assert.IsNotNull(i);
Assert.IsNotNull(i.dep);
}
[Test]
public void UnityCanSetPrivateDependency()
{
UnityContainer container = new UnityContainer();
container.RegisterType<HasPrivateDep, HasPrivateDep>();
container.RegisterType<TheDep, TheDep>();
var i = container.Resolve<HasPrivateDep>();
Assert.IsNotNull(i);
Assert.IsNotNull(i.depExposed);
}
}
public class HasPublicDep …Run Code Online (Sandbox Code Playgroud) 我想知道我应该如何存储/引用我的依赖注入容器.将容器作为静态类的静态属性是否可以?或者我应该将容器作为应用程序的实例变量吗?我想知道每个选项的优缺点是什么,以及在web,mvc,console和windows应用程序中最佳实践是什么?
structuremap dependency-injection castle-windsor inversion-of-control unity-container
我正试图像这样向我的MVC控制器注入一个依赖项
private static void RegisterContainer(IUnityContainer container)
{
container
.RegisterType<IUserService, UserService>()
.RegisterType<IFacebookService, FacebookService>();
}
Run Code Online (Sandbox Code Playgroud)
UserService类有一个像这样的构造函数...
public UserService(): this(new UserRepository(), new FacebookService())
{
//this a parameterless constructor... why doesnt it get picked up by unity?
}
public UserService(IUserRepository repository, IFacebookService facebook_service)
{
Repository=repository;
this.FacebookService=facebook_service;
}
Run Code Online (Sandbox Code Playgroud)
我得到的例外是以下......
当前类型Repositories.IUserRepository是一个接口,无法构造.你错过了类型映射吗?
看起来它正在尝试将一个构造函数注入到服务中,但是默认就足够了吗?为什么它不映射到无参数构造函数?
我如何获得microsoft unity来"构造"给定接口类型的类列表.
很简单的例子:
List<IShippingCalculation> list = new List<IShippingCalculation>();
list.Add(new NewYorkShippingCalculation());
list.Add(new FloridaShippingCalculation());
list.Add(new AlaskShippingCalculation());
//Not What I want
public void calcship(List<IShippingCalculation> list)
{
var info = new ShippingInfo(list);
info.CalculateShippingAmount(State.Alaska)
}
//Somehow in unity, must i do this for all the concrete classes?
//how does it know to give a list.
Container.RegisterType<IShippingInfo,new AlaskaShippingCalculation()>();??
//What I want
public void calcship(IShippingInfo info)
{
info.CalculateShippingAmount(State.Alaska)
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
Unity 2.0:
默认情况下,RegisterInstance使用ContainerControlledLifetimeManager.当处置Unity容器时,它会调用实例上的Dispose(如果是IDisposable).
在我的情况下,这不是我想要的.该实例由另一个类拥有并处置; Unity应该只注入引用.所以我用过:
container.RegisterInstance(instance, new ExternallyControlledLifetimeManager());
Run Code Online (Sandbox Code Playgroud)
Unity文档(在了解终身经理下)指出:
使用RegisterInstance方法注册现有对象会产生与刚刚使用RegisterType注册生命周期容器相同的行为.因此,建议您在使用非默认生存期管理器时不使用RegisterInstance方法注册现有对象,但调用RegisterInstance的线程除外.
这是什么意思?
同一部分还指出:
如果使用RegisterInstance方法注册了对象的现有实例,则容器将为Resolve或ResolveAll的所有调用返回相同的实例,或者当依赖性机制将实例注入其他类时,前提是满足下列条件之一:
- 您已指定容器控制的生命周期管理器
- 您已使用默认生命周期管理器
- 您正在使用不同的生命周期管理器在您注册实例的相同上下文中进行解析.
在使用RegisterInstance和ExternallyControlledLifetimeManager之后,我尝试在另一个线程中解析,并且它工作了 - 我得到了单例实例.
我的代码与"创建实例注册"部分中的示例相匹配.不过,我想确保理解背景警告.
为了清楚起见,我总是希望Unity容器注入我注册的实例而不管线程等,我不希望Unity处理它.我这样做了吗?
c# dependency-injection idisposable unity-container unity2.0
我有以下统一构造方法:
public static IUnityContainer CreateContainer()
{
UnityContainer container = new UnityContainer();
container.LoadConfiguration();
.......
}
Run Code Online (Sandbox Code Playgroud)
然后是一个接口和一个实现类:
namespace MyCompany.Web.Areas.MyApp.Common
{
public interface ISession
{
}
}
namespace MyCompany.Web.Areas.MyApp.Common
{
public class SessionHandler : ISession
{
}
}
Run Code Online (Sandbox Code Playgroud)
而不是这样做:
Container.RegisterType<ISession, SessionHandler>(new ContainerControlledLifetimeManager()) ;
Run Code Online (Sandbox Code Playgroud)
我想使用container.LoadConfiguration()从web.config加载上面的RegisterType配置.但它似乎不起作用
web.config中:
<unity>
<containers>
<container>
<types>
<type type="MyCompany.Web.Areas.MyApp.Common.ISession" mapTo="MyCompany.Web.Areas.MyApp.Common.SessionHandler">
<lifetime type="singleton"/>
</type>
</types>
</container>
</containers>
</unity>
Run Code Online (Sandbox Code Playgroud)
例外:
无法解析类型名称或别名MyProject.Web.Areas.MyApp.Common.ISession.请检查配置文件并验证此类型名称.
描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.
异常详细信息: System.InvalidOperationException:无法解析类型名称或别名MyProject.Web.Areas.MyApp.Common.ISession.请检查配置文件并验证此类型名称.
来源错误:
第33行:{第34行:UnityContainer容器=新的UnityContainer(); 第35行:container.LoadConfiguration(); 第36行:第37行://container.RegisterType(new ContainerControlledLifetimeManager());
堆栈跟踪:
[InvalidOperationException:无法解析类型名称或别名MyProject.Web.Areas.MyApp.Common.ISession.请检查您的配置文件并验证此类型名称.] e:\ Builds\Unity\UnityTemp\Compile\Unity\Unity.Configuration \中的Microsoft.Practices.Unity.Configuration.ConfigurationHelpers.TypeResolverImpl.ResolveType(String typeNameOrAlias,Boolean throwIfResolveFails) Src\ConfigurationHelpers\TypeResolverImpl.cs:110 Microsoft.Practices.Unity.Configuration.ConfigurationHelpers.TypeResolver.ResolveType(String typeNameOrAlias)在e:\ Builds\Unity\UnityTemp\Compile\Unity\Unity.Configuration\Src\ConfigurationHelpers\TypeResolver中. cs:47 …
我有一个Windows服务,我使用OWIN和NancyFX来托管一个网站.在我服务的许多地方,我使用Unity将依赖项注入类,主要是服务.但是,如果我在任何Nancy模块中使用它们,依赖关系会被解析两次,因为Nancy使用自己的IoC容器(TinyIoC).
幸运的是,Nancy允许通过创建nancy bootstrapper来覆盖默认的IoC容器生成和现有容器的使用.但是如何将现有的IUnityContainer传递给引导程序?
基本上,我只需要启动OWIN就是......
WebApp.Start<MyOwinStarter>(url);
Run Code Online (Sandbox Code Playgroud)
如何将Unity容器传递给它以将其进一步传递给nancy bootstrapper?
我使用Unity作为我的IoC框架,我正在基于处理程序中每个请求的标头中的值创建一个类型:
var container = new UnityContainer();
container.RegisterType<IFoo,Foo>(new InjectionConstructor(valuefromHeader));
GlobalConfiguration.Configuration.DependencyResolver =
new Unity.WebApi.UnityDependencyResolver(container);
Run Code Online (Sandbox Code Playgroud)
问题是处理程序SendAsync意味着全局容器被不同的请求覆盖,并且在构造函数中使用IFoo的控制器得到错误的值.
1)我可以使SendAsync同步吗?2)如果没有,如何为每个请求创建不同的实例并让IoC容器安全解析?
我查看了以下文章但没有成功:
http://www.asp.net/web-api/overview/extensibility/using-the-web-api-dependency-resolver http://www.strathweb.com/2012/11/asp-net-web-api -and-dependencies-in-request-scope/ http://benfoster.io/blog/per-request-dependencies-in-aspnet-web-api-using-structuremap
提前致谢.
我使用Unity App Block作为我的WOC项目服务层的IOC容器.使用Unity.WCF库将其插入每个WCF服务时,这非常有效.
我最近将RabbitMQ引入了我的服务层,我目前正在使用"使用"块来连接并添加到队列中.我不喜欢这个,我想用它HierachicalLifetimeManager来创建和销毁我与RabbitMQ的连接,因为我需要它们?这听起来不错吗?
我正在寻找一个这样的样本,或者至少是关于最佳方法的一些指导?(例如,我是否应该封装连接并根据需要注入每个服务?我将如何封装RabbitMQ使用者等?)
我正在使用Unity.MVC4依赖注入来访问我的服务.注入到我的Controller构造函数中时,一切都正常,但我现在要做的是在我的过滤器类中使用属性注入,这样我就可以从内部访问我的数据库了.
在我开始这个问题之前,我用Google搜索并尝试了不同的示例,但我找不到适合我的解决方案..
Bootstrapper.cs
public static class Bootstrapper
{
public static IUnityContainer Initialise()
{
var container = BuildUnityContainer();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
return container;
}
private static IUnityContainer BuildUnityContainer()
{
var container = new UnityContainer();
container.RegisterType<IAccountRepository, AccountRepository>();
container.RegisterType<IAdministrationRepository, AdministrationRepository>();
container.RegisterType<IUploadDirectlyRepository, UploadDirectlyRepository>();
container.RegisterType<IUserRepository, UserRepository>();
container.RegisterType<INewsRepository, NewsRepository>();
container.RegisterType<IContactRepository, ContactRepository>();
// register all your components with the container here
// it is NOT necessary to register your controllers
// e.g. container.RegisterType<ITestService, TestService>();
RegisterTypes(container);
return container;
}
public static void RegisterTypes(IUnityContainer container)
{ …Run Code Online (Sandbox Code Playgroud) asp.net-mvc dependency-injection unity-container action-filter asp.net-mvc-4
unity-container ×10
c# ×6
.net ×2
asp.net-mvc ×2
asp.net ×1
idisposable ×1
nancy ×1
owin ×1
rabbitmq ×1
structuremap ×1
unity2.0 ×1