我有一个HandleErrorAttribute延伸的习惯FilterAttribute.
如何在注入控制器的依赖项本身的同时将Unity注入依赖项注入此属性?
我正在使用MS Unity容器进行依赖注入,但"Resolve"正在返回意外结果.
有没有办法可以调试这个分辨率?如果我可以查看容器中注册的类型/实例,那将会很棒,但是在使用QuickWatch时我无法看到它存储在何处.如果我可以让容器输出一些调试跟踪也会很有用.
有什么建议?
我在尝试使用Unity容器时实现自己的拦截.我希望以尊重所使用的终身经理的方式这样做.即如果它是一个PerResolveLifetimeManager,那么我想包装实例一次,我希望在整个解析过程中使用该包装实例.
到目前为止,我实现了一个BuilderStrategy,我使用自定义UnityContainerExtension类添加到我的容器中(我将PostInitialization传递给AddNew方法;我不确定最合适的值是什么,但这似乎有效).在我的BuilderStrategy中的PostBuildUp覆盖中,我将context.Existing替换为我的包装值.
当我在PerResolve生命周期中使用它时,会发生一次换行,但只有第一次使用依赖项才能获得包装的实例,其余的则获得一个非包装的实例.即如果我的ctor接收IFoo foo1和IFoo foo2那么只有foo1是我的包装实例,而foo2是未包装的实例.
这是一个示例repro(为简单起见,我使用另一个类的实例,Foo2,而不是包装):
public class MyInterception : UnityContainerExtension
{
protected override void Initialize()
{
Context.Strategies.AddNew<MyInterceptionStrategy>(UnityBuildStage.PostInitialization);
}
}
public class MyInterceptionStrategy : BuilderStrategy
{
public override void PostBuildUp(IBuilderContext context)
{
if (!context.OriginalBuildKey.Type.IsInterface)
{
return;
}
context.Existing = new Foo2();
}
}
public class Bar
{
public Bar(IFoo f1, IFoo f2, IFoo f3)
{
}
}
public interface IFoo
{
}
public class Foo1 : IFoo
{
}
public class Foo2 : IFoo
{
}
public void Main()
{ …Run Code Online (Sandbox Code Playgroud) 任何其他.NET IoC容器都能为Castle Windsor的类型化工厂提供相同的功能吗?
例如,如果我在WPF应用程序中使用抽象工厂模式:
public class MyViewModel
{
private IAnotherViewModelFactory factory;
public void ShowAnotherViewModel()
{
viewController.ShowView(factory.GetAnotherViewModel());
}
}
Run Code Online (Sandbox Code Playgroud)
我不想为我希望展示的每种类型的ViewModel创建IAnotherViewModelFactory的手动实现,我希望容器能够为我处理这个问题.
castle-windsor ninject unity-container autofac abstract-factory
我有一些类,如AccountsController,ProductsController等,都继承自BaseController.Unity根据需要设置我的服务.这些类也都需要_sequence服务.因为它是所有类的常见要求,我想在BaseController中对此进行编码.
public class AccountsController : BaseController
{
public AccountsController(
IService<Account> accountService) {
_account = accountService;
}
public class ProductsController : BaseController
{
public ProductsController(
IService<Account> productService) {
_product = productService;
}
public class BaseController : Controller
{
public IService<Account> _account;
public IService<Product> _product;
protected ISequenceService _sequence;
public BaseController(
ISequenceService sequenceService) {
_sequence = sequenceService;
}
Run Code Online (Sandbox Code Playgroud)
但是我怎么能这样做呢?我应该在每个AccountsController和ProductsController的构造函数中设置对BaseController的调用吗?
我正在尝试Dependency injection在我的MVC应用程序中实现.我正在使用Unity.Mvc3.dllIoC.我只是想知道Unity如何不能从另一个程序集中注册类型.这是代码:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
var container = new UnityContainer();
// ok: register type from this assembly
container.RegisterType<IMessages, Messages>();
// fail: register type from another assembly (service reference)
container.RegisterType<IPlayerService, PlayerService>();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}
public class UnityDependencyResolver : IDependencyResolver
{
private readonly IUnityContainer _container;
public UnityDependencyResolver(IUnityContainer container)
{
this._container = container;
}
public object GetService(Type serviceType)
{
try
{
return _container.Resolve(serviceType);
}
catch (Exception ex)
{
throw ex;
}
}
public IEnumerable<object> GetServices(Type …Run Code Online (Sandbox Code Playgroud) 我需要使用Unity我的DI容器并想要引导AutoMapper.
使用StructureMap我可以这样做;
For<IMappingEngine>().Use(() => Mapper.Engine);
Run Code Online (Sandbox Code Playgroud)
我该怎么办Unity?
我已经使用包管理器来获取当前最新版本的AutoMapper2.2.1-ci9000,但在更简单的情况下也可以使用2.2.0.我使用的是2.1.505.0版Microsoft.Practices.Unity.
dependency-injection ioc-container unity-container automapper
我一直在玩Unity以了解它,并遇到了以下情况.如果我要两次注册相同类型,但是一个是单例,我怎么调用Resolve才能返回单例?我知道这可以使用一个独特的Name,但我想知道如果没有这个可以完成.
例如:
_container.RegisterType<Music>(new InjectionConstructor(new Album("Non-singleton", "Non-singleton")));
_container.RegisterType<Music>(new ContainerControlledLifetimeManager());
Run Code Online (Sandbox Code Playgroud)
并打电话
var music = Factory.Resolve<Music>();
Run Code Online (Sandbox Code Playgroud)
返回'Non-singleton'对象.起初,我认为这是基于注册顺序,但切换我仍然收到'非单例'实例.
是否有一个原因?有没有办法Resolve只在同一容器中的两个注册对象的单例类型w/out指定Name属性?
.net c# dependency-injection inversion-of-control unity-container
我想在使用VS2012的WPF应用程序中使用Unity,我将Unity容器定义如下:
IUnityContainer unityContainer = new UnityContainer();
unityContainer.RegisterType<IMainViewModel, MainViewModel>();
var window = unityContainer.Resolve<MainWindow>();
window.Show();
Run Code Online (Sandbox Code Playgroud)
我的窗口构造函数如下所示:
public MainWindow(IMainViewModel mainViewModel)
{
InitializeComponent();
this.DataContext = mainViewModel;
}
Run Code Online (Sandbox Code Playgroud)
当我运行该应用程序时,我收到以下错误:
PresentationFramework.dll中发生未处理的"System.Windows.Markup.XamlParseException"类型异常
附加信息:'类型'WPFClient.MainWindow'上找不到匹配的构造函数.您可以使用Arguments或FactoryMethod指令来构造此类型.行号"3"和行位置"9".
我究竟做错了什么?
我在这里使用Unity.但可能我们只需指向一个正确的方向.
我们知道如何注入接口:
public class AccountController:ApiController
{
private readonly IAccountRepository _repository;
public AccountController(IAccountRepository repository)
{
_repository = repository;
}
}
Run Code Online (Sandbox Code Playgroud)
使用RegisterType
var container = new UnityContainer();
container.RegisterType<IAccountRepository, AccountRepository>(new HierarchicalLifetimeManager());
Run Code Online (Sandbox Code Playgroud)
但是在我的AccountRepository中,我们将一个类注入到构造函数中.
private readonly ApplicationUserManager _userManager;
public AccountRepository(ApplicationUserManager userManager)
{
_userManager = userManager;
}
Run Code Online (Sandbox Code Playgroud)
因此,在调用ApiController时,我仍然会收到此错误:
尝试创建"AccountController"类型的控制器时发生错误.确保控制器具有无参数的公共构造函数.
堆栈跟踪:
System.Web.Http.Detpatcher.DefaultHttpControllerActivator.GetInstanceOrActivator上的System.Web.Http.Internal.TypeActivator.Create [TBase](Type instanceType)中的System.Linq.Expressions.Expression.New(Type type)(HttpRequestMessage请求,类型System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage请求,HttpControllerDescriptor controllerDescriptor,类型controllerType)中的controllerType,Func`1和activator)
由于我已经创建了一些其他工作正常的ApiControllers,我想这一定是因为我们的ApplicationUserManager无法解析.
这里ApplicationUserManager继承自UserManager而不是接口.我不能用container.RegisterType<interface, derived_class>.解决问题的正确方法是什么?
这是ApplicationUserManager:
public class ApplicationUserManager : UserManager<User>
{
public ApplicationUserManager(IdentityContext identityContext)
: base(new UserStore<User>(identityContext)) …Run Code Online (Sandbox Code Playgroud)