我是否可以测试类型是否已在Unity容器中注册而不调用Resolve并捕获异常?
我有一个HandleErrorAttribute延伸的习惯FilterAttribute.
如何在注入控制器的依赖项本身的同时将Unity注入依赖项注入此属性?
我创建了一个我输入的ISearchable接口,以便我可以检索结果的IEnumerable.
我有许多服务为不同的域对象实现ISearchable ...
Container.RegisterType<ISearchable<Animal>, AnimalService>();
Container.RegisterType<ISearchable<Fish>, FishService>();
Run Code Online (Sandbox Code Playgroud)
我想根据类型解决(通过Unity)一个ISearchable,但我正努力让它工作......
以下dos不能编译,但希望能够了解我正在努力实现的目标.
Type t = typeof(Animal);
var searchProvider = _container.Resolve<ISearchable<t>>();
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
在我的Asp.net MVC项目中
我有一个初始化统一容器的bootsrapper.
我不知道为什么,但我明白了
System.Core.dll中发生了未处理的"System.StackOverflowException"类型异常
我加倍检查,只在我的初始化程序中完成注册.
所有依赖项仅在ctors中注入.
可能是什么导致了这个?
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
Initializer.Initialize();
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
Run Code Online (Sandbox Code Playgroud)
它失败了 BundleConfig.RegisterBundles(BundleTable.Bundles);
public static class Initializer
{
private static bool isInitialize;
private static readonly object LockObj = new object();
private static IUnityContainer defaultContainer = new UnityContainer();
static Initializer()
{
Initialize();
}
public static void Initialize()
{
if (isInitialize)
return;
lock (LockObj)
{
IUnityContainer container = defaultContainer;
//registering Unity for MVC
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
//registering Unity for web API
// GlobalConfiguration.Configuration.DependencyResolver = new …Run Code Online (Sandbox Code Playgroud) 我有一个ICallHandler,我想在我的所有Unity容器实例中注册.
例如,采用以下处理程序:
public class ProfilerHandler : ICallHandler
{
public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
{
//start timer
IMethodReturn methodReturn = getNext()(input, getNext);
//stop timer
}
public int Order
{
get; set;
}
}
Run Code Online (Sandbox Code Playgroud)
以下是IoC容器构造函数:
public class IoCContainer : UnityContainer
{
public IoCContainer()
{
this.RegisterType<IUserService, UserService>(new ContainerControlledLifetimeManager());
this.RegisterType<IRepository<User>, UserRepository>(new ContainerControlledLifetimeManager());
}
}
Run Code Online (Sandbox Code Playgroud)
我想要做的就是使用所有这些类型注册此处理程序.
我可以用一些非常详细的代码来做这件事:
public class IoCContainer : UnityContainer
{
public IoCContainer()
{
this.AddNewExtension<Interception>();
this.RegisterType<IUserService, UserService>(new ContainerControlledLifetimeManager()).Configure<Interception>().SetInterceptorFor<IUserService>(new InterfaceInterceptor());
this.RegisterType<IRepository<User>, UserRepository>(new ContainerControlledLifetimeManager()).Configure<Interception>().SetInterceptorFor<IRepository<User>>(new InterfaceInterceptor());
}
}
Run Code Online (Sandbox Code Playgroud)
但是我不仅要在我的所有类型注册上编写相同的拦截代码(想象一下,如果我有100多个类型注册),但我也必须HandlerAttribute在每个接口上包含一个(再次,如果我有100多个接口,那就不好了)适用于此).
这是我唯一的选择,还是有办法在容器级别执行此操作以避免必须将其应用于每个单独的类型注册和界面?
我想在使用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".
我究竟做错了什么?
使用默认参数注入构造函数的问题.
例如
container.RegisterType<IAddressImportRepository, AddressImportRepository>(
new PerRequestLifetimeManager());
public AddressImportRepository(
FairFlexxDbContext context, bool isUseSecurePredicate = true)
: base(context, isUseSecurePredicate)
{
}
Run Code Online (Sandbox Code Playgroud)
错误:
[InvalidOperationException:类型Boolean没有可访问的构造函数.]
Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.ThrowForNullExistingObject(IBuilderContext context)+239 lambda_method(Closure,IBuilderContext)+60
Microsoft.Practices.ObjectBuilder2.<> c__DisplayClass1.b__0(IBuilderContext上下文)+71
Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context)+42
Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context)+333
Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)+274
Microsoft .Practices.ObjectBuilder2.BuilderContext.NewBuildUp(NamedTypeBuildKey newBuildKey)+167
Microsoft.Practices.Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve(IBuilderContext context)+101 lambda_method(Closure,IBuilderContext)+425
Microsoft.Practices.ObjectBuilder2.<> c__DisplayClass1.b__0 (IBuilderContext context)+71
Microsoft.Practices.ObjectB uilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context)+42
Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context)+333
Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)+274
Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp (NamedTypeBuildKey newBuildKey)+167
Microsoft.Practices.Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve(IBuilderContext context)+101 lambda_method(Closure,IBuilderContext)+222
Microsoft.Practices.ObjectBuilder2.<> c__DisplayClass1.b__0(IBuilderContext context)+71
Microsoft. Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context)+42
Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context)+333
Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)+274
Microsoft.Practices.Unity.UnityContainer .DoBuildUp(Type t,Object existing,String name,IEnumerable`1 resolverOverri des)+383
我发现了serilog(.net的结构化日志),并发现了很多优点.但是我遇到了一些问题.我有4个项目,一个是web,一个是基础设施,另外两个是windows服务,我想声明一次serilog配置并多次使用它.而且我也希望将它与依赖注入一起使用.我已经在网上搜索了三天了,但我没有找到任何有用的东西,请一些人帮助我.
例如,我希望这个类成为我的日志类.
public interface IMyLogger
{
void Information(string message, object[] parameters);
}
public class MyLogger : IMyLogger
{
public MyLogger()
{
}
public void Information(string message, object[] parameters)
{
Log.Information("LogType : {LogType} - Operation : {Operation}", parameters);
}
}
public class UserClass
{
private readonly IMyLogger _myLogger;
public UserClass(IMyLogger myLogger)
{
_myLogger = myLogger;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我不知道应该把这行代码放在哪里:
Log.Logger = new LoggerConfiguration()
.WriteTo.Console()
.CreateLogger();
Run Code Online (Sandbox Code Playgroud)
Tnx提前.
我正在使用Microsoft Unity作为IoC容器的新ASP.Net Web API项目。我有些困惑,哪个是正确的。
如果我设置DependencyResolver的System.Web.Http.HttpConfiguration。然后,我可以调用具有依赖性的API控制器,并且这些依赖性已由Unity框架解决。但是,对于像HomeControllerUnity 这样的MVC控制器,DependencyResolver在我将in 设置为in 之前无法注入任何依赖项System.Web.Mvc。
API控制器依赖性已解决,但MVC控制器依赖性未解决。如果我在下面添加代码:
public class IocConfig
{
public static void Register(HttpConfiguration config)
{
var container = UnityConfig.GetConfiguredContainer();
FilterProviders.Providers.Remove(FilterProviders.Providers.OfType<FilterAttributeFilterProvider>().First());
FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(container));
config.DependencyResolver = new UnityResolver(container);
//DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}
}
Run Code Online (Sandbox Code Playgroud)
MVC控制器依赖关系已成功解决,但API控制器依赖关系未成功解决。如果我在下面添加代码:(取消注释该行)
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
Run Code Online (Sandbox Code Playgroud)
只是让您知道项目模板是ASP.Net Web API,而我正在使用Microsoft.Unity。
我应该同时设置DependencyResolver还是做错什么?