我们希望使用Unity拦截,但我们不知道如何在不使用Unity容器的Resolve-Method 的情况下实例化对象。 为简单起见,在下面的示例中,Unity Container是Program的公共静态字段,因此每个人都可以访问它(我知道它有多丑!):
class Program
{
// Ugly hack
public static readonly IUnityContainer Container;
static void Main(string[] args)
{
var service = Container.Resolve<EntityService>();
// Entity with LazyLoadingInterceptionBehavior
var entity = service.GetEntity(10);
}
static Program()
{
Container = new UnityContainer().AddNewExtension<Interception>();
Container.RegisterType<IEntity, Entity>(new Interceptor<InterfaceInterceptor>(),
new InterceptionBehavior<LazyLoadingInterceptionBehavior>());
Container.RegisterType<IEntityService, EntityService>();
}
}
public interface IEntity
{
int Id { get; set; }
}
public class Entity : IEntity
{
public int Id { get; set; }
}
public class EntityService : IEntityService
{
public IEntity GetEntity(int id)
{
// Ugly hack???
var entity = Program.Container.Resolve<IEntity>();
entity.Id = id;
return entity;
}
}
public interface IEntityService
{
IEntity GetEntity(int id);
}
如果没有UnityContainer泄漏到EntityService,实现这个的正确方法是什么?这种方法最重要的缺点是什么?