- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想用 WithMappings.FromMatchingInterface
将所有实现特定接口(interface)的类注册到 Unity 中。惯例。此外,我希望使用接口(interface)拦截行为来拦截所有已注册的对象。问题是 Unity 还注册了具体类之间的映射,当这些类被解析时,会抛出异常并显示以下消息:
"[type] is not interceptable"
VirtualMethodInterceptor
因为我不想为了拦截工作而对类进行更改,这包括从
MarshalByRef
继承.我还想避免单独注册所有对象。
container.RegisterType<ISomeService, SomeService>(new InjectionMember[]
{
new Interceptor<InterfaceInterceptor>(),
new InterceptionBehavior<TraceInterceptor>()
});
container.RegisterType<ISomeRepository, SomeRepository>(new InjectionMember[]
{
new Interceptor<InterfaceInterceptor>(),
new InterceptionBehavior<TraceInterceptor>()
});
InterfaceInterceptor
在基于公约的注册中。
foreach (var type in types)
{
container
.Configure<Interception>()
.SetDefaultInterceptorFor(type.GetInterface("I" + type.Name), new InterfaceInterceptor());
}
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.InterceptionExtension;
using System;
using System.Diagnostics;
using System.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
IUnityContainer container = new UnityContainer();
container.AddNewExtension<Interception>();
var types = AllClasses.FromAssemblies(typeof(ISomeService).Assembly).Where(type => type == typeof(SomeService) || type == typeof(SomeRepository));
container.RegisterTypes(
types,
WithMappings.FromMatchingInterface,
getLifetimeManager: WithLifetime.ContainerControlled,
getInjectionMembers: c => new InjectionMember[]
{
new Interceptor<InterfaceInterceptor>(),
new InterceptionBehavior<TraceInterceptor>()
});
// this works fine, the interceptor does what it is supposed to.
var someService1 = container.Resolve<ISomeService>();
someService1.SomeServiceMethod("Hello from main method");
// should I by any chance resolve using the concrete service directly, it has a meltdown due to the interface interceptor.
var someService2 = container.Resolve<SomeService>();
someService2.SomeServiceMethod("This will never be shown due to a hissy fit thrown by the container about the concrete SomeService is not interceptable.");
}
}
public class TraceInterceptor : IInterceptionBehavior
{
public System.Collections.Generic.IEnumerable<System.Type> GetRequiredInterfaces()
{
return Type.EmptyTypes;
}
public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
{
Trace.WriteLine(string.Format("Hello from trace interception behavior for type [{0}]!", input.Target.GetType().FullName));
return getNext().Invoke(input, getNext);
}
public bool WillExecute
{
get { return true; }
}
}
public interface ISomeService
{
string SomeServiceMethod(string someParameter);
}
public class SomeService : ISomeService
{
private ISomeRepository _someRepository;
public SomeService(ISomeRepository someRepository)
{
_someRepository = someRepository;
}
public string SomeServiceMethod(string someParameter)
{
return _someRepository.SomeRepositoryMethod(someParameter);
}
}
public interface ISomeRepository
{
string SomeRepositoryMethod(string someParameter);
}
public class SomeRepository : ISomeRepository
{
public string SomeRepositoryMethod(string someParameter)
{
Trace.WriteLine(someParameter);
return "Hello from repository!";
}
}
}
最佳答案
我相信我可以对您的问题有所了解。我也想知道为什么要注册具体类型以及将相同具体类型映射到其接口(interface)的注册。
我进行了搜索以发现是否有其他人遇到同样的问题,认为我可能做错了什么。但我最终进入了这个 Codeplex 讨论线程:Registration convention generates two registrations for each mapping .在这个线程中,randylevy(在第 3 篇到最后一篇文章中)指出这是 LifetimeManager
时的默认行为。和/或注入(inject)成员被指定为公约的一部分:
In terms of the behavior you are seeing, I believe this is by design. If you specify a
LifetimeManager
orinjectionMembers
then Unity will register any types passed in with the supplied values. This makes sense in general because the user has specified the various configuration they desire for the types passed in.For example you can also use registration by convention to just register types:
container.RegisterTypes(
AllClasses.FromLoadedAssemblies(false, false, false, false),
WithMappings.None,
WithName.Default,
t => new ContainerControlledLifetimeManager(),
null,
true);So in this case all classes (lets say
Class1
) will be registered as singletons (ContainerControlledLifetimeManager
) with no interface mapping (WithMappings.None
). If the lifetime manager was not specified thenClass1
would not have been registered. But because the lifetime manager is specified the registration needs to be setup to use the correct user specified lifetime manager.
MyService
和对应的接口(interface)
IMyService
和相应的验证器
MyServiceValidator
.我创建了一个
ServiceRegistrationConvention
类来完成此操作,如下所示:
public class ServiceRegistrationConvention : RegistrationConvention
{
/// <summary>
/// Gets a function to get the types that will be requested for
/// each type to configure.
/// </summary>
public override Func<Type, IEnumerable<Type>> GetFromTypes()
{
return WithMappings.FromMatchingInterface;
}
/// <summary>
/// Gets a function to get the additional
/// <see cref="T:Microsoft.Practices.Unity.InjectionMember" />
/// objects for the registration of each type. Defaults to no injection members.
/// </summary>
public override Func<Type, IEnumerable<InjectionMember>> GetInjectionMembers()
{
return GetServiceValidator;
}
/// <summary>
/// Gets a function to get the
/// <see cref="T:Microsoft.Practices.Unity.LifetimeManager" />
/// for the registration of each type. Defaults to no
/// lifetime management (e.g. transient).
/// </summary>
public override Func<Type, LifetimeManager> GetLifetimeManager()
{
// Where I work, we use this lifetime manager for everyting.
// I wouldn't recommend this right off the bat--I'm looking
// into changing this, personally, but right now, this is
// what we use and it works for our MVC application.
return WithLifetime.Custom<PerRequestLifetimeManager>;
}
/// <summary>
/// Gets a function to get the name to use for the registration of each type.
/// </summary>
public override Func<Type, string> GetName()
{
return WithName.Default;
}
/// <summary>
/// Gets types to register.
/// </summary>
public override IEnumerable<Type> GetTypes()
{
// You may want to further restrict the search for classes to register
// by doing some sort of namespace matching:
//
// t.Namespace.StartsWith(
// "MyCompanyNamespacePrefix", StringComparison.Ordinal
// )
//
// for example.
return AllClasses.FromLoadedAssemblies()
.Where(t => t.Name.EndsWith("Service", StringComparison.Ordinal));
}
/// <summary>
/// Given a type, get the type's corresponding validator, if any.
/// </summary>
private IEnumerable<InjectionMember> GetServiceValidator(Type type)
{
if (type == null)
throw new ArgumentNullException("type");
// In our case, the validators live in the same assembly
// as the class its validating...
string matchingValidatorName = string.Concat(type.Name, "Validator");
Type vType = AllClasses.FromAssemblies(new[] { type.Assembly })
.FirstOrDefault(t =>
string.Equals(t.Name, matchingValidatorName, StringComparison.Ordinal)
);
return (vType != null) ?
new List<InjectionMember>
{
new Interceptor<InterfaceInterceptor>(),
new InterceptionBehavior(vType)
}
:
null;
}
}
关于unity-container - 使用接口(interface)拦截器按约定注册 Unity 导致 "[type] is not interceptable"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22869002/
我正在尝试在我的代码库中为我正在编写的游戏服务器更多地使用接口(interface),并了解高级概念以及何时应该使用接口(interface)(我认为)。在我的例子中,我使用它们将我的包相互分离,并使
我有一个名为 Widget 的接口(interface),它在我的整个项目中都在使用。但是,它也用作名为 Widget 的组件的 Prop 。 处理此问题的最佳方法是什么?我应该更改我的 Widget
有一个接口(interface)可以是多个接口(interface)之一 interface a {x:string} interface b {y:string} interface c {z:st
我遇到了一种情况,我需要调用第三方服务来获取一些信息。这些服务对于不同的客户可能会有所不同。我的界面中有一个身份验证功能,如下所示。 interface IServiceProvider { bool
在我的例子中,“RequestHandlerProxy”是一个结构,其字段为接口(interface)“IAdapter”,接口(interface)有可能被调用的方法,该方法的输入为结构“Reque
我有一个接口(interface)Interface1,它已由类A实现,并且设置了一些私有(private)变量值,并且我将类A的对象发送到下一个接受输入作为Interface2的类。那么我怎样才能将
假设我有这样的类和接口(interface)结构: interface IService {} interface IEmailService : IService { Task SendAs
有人知道我在哪里可以找到 XML-RPC 接口(interface)的定义(在 OpenERP 7 中)?我想知道创建或获取对象需要哪些参数和对象属性。每个元素的 XML 示例也将非常有帮助。 最佳答
最近,我一直在阅读有关接口(interface)是抽象的错误概念的文章。一篇这样的帖子是http://blog.ploeh.dk/2010/12/02/InterfacesAreNotAbstract
如果我有一个由第三方实现的现有 IInterface 后代,并且我想添加辅助例程,Delphi 是否提供了任何简单的方法来实现此目的,而无需手动重定向每个接口(interface)方法?也就是说,给定
我正在尝试将 Article 数组分配给我的 Mongoose 文档,但 Typescript 似乎不喜欢这样,我不知道为什么它显示此警告/错误,表明它不可分配. 我的 Mongoose 模式和接口(
我有两个接口(interface): public interface IController { void doSomething(IEntity thing); } public inte
是否可以创建一个扩展 Serializable 接口(interface)的接口(interface)? 如果是,那么扩展接口(interface)的行为是否会像 Serilizable 接口(int
我试图在两个存储之间创建一个中间层,它从存储 A 中获取数据,将其转换为相应类型的存储 B,然后存储它。由于我需要转换大约 50-100 种类型,我希望使用 map[string]func 并根据 s
我正在处理一个要求,其中我收到一个 JSON 对象,其中包含一个日期值作为字符串。我的任务是将 Date 对象存储在数据库中。 这种东西: {"start_date": "2019-05-29", "
我们的方法的目标是为我们现有的 DAO 和模型类引入接口(interface)。模型类由各种类型的资源 ID 标识,资源 ID 不仅仅是随机数,还带有语义和行为。因此,我们必须用对象而不是原始类型来表
Collection 接口(interface)有多个方法。 List 接口(interface)扩展了 Collection 接口(interface)。它声明与 Collection 接口(int
我有一个 Java 服务器应用程序,它使用 Jackson 使用反射 API 对 DTO 进行一般序列化。例如对于这个 DTO 接口(interface): package com.acme.libr
如果我在 Kotlin 中有一个接口(interface): interface KotlinInterface { val id: String } 我可以这样实现: class MyCla
我知道Java中所有访问修饰符之间的区别。然而,有人问了我一个非常有趣的问题,我很难找到答案:Java 中的 private 接口(interface)和 public 接口(interface)有什
我是一名优秀的程序员,十分优秀!