如何让 Unity 在创建对象实例之后但在将其注入任何地方之前调用方法
How to make Unity call a method after creating an object instance but before it is injected anywhere
我正在使用 Unity 进行依赖注入。我想实现这样的目标:
public interface MyInterface { void MyMethod(); }
构建 Unity 容器时:
myContainer.RegisterType<MyInterface, MyConcreteType>();
myContainer.AddPostConstructor(x => (x as MyInterface)?.MyMethod());
可能吗?有没有better/more优雅的方法?
可能是这样的:
myContainer.RegisterType<MyInterface, MyConcreteType>(new InjectionFactory(c =>
{
var result = c.Resolve<MyConcreteType>();
result.MyMethod();
return result;
}));
另一种方式——通过特殊工厂注册实现并使用它:
class Factory
{
IUnityContainer _container;
public Factory(IUnityContainer container)
{
_container = container;
}
public void Register<TType>() where TType : MyInterface
{
myContainer.RegisterType<MyInterface, TType>(new InjectionFactory(c =>
{
var result = c.Resolve<TType>();
result.MyMethod();
return result;
}));
}
public MyInterface Get()
{
_container.Resolve<MyInterface>();
}
}
...
public TestClass
{
Factory _factory;
public TestClass(Factory factory)
{
_factory = factory;
_factory.Register<MyConcreteType>();
}
public void TestMethod()
{
var service = _factory.Get();
}
}
因此,所有未来的实现都必须在工厂中注册。但是仍然不能保证方法 MyMethod
将被正确实施或完全实施。
我正在使用 Unity 进行依赖注入。我想实现这样的目标:
public interface MyInterface { void MyMethod(); }
构建 Unity 容器时:
myContainer.RegisterType<MyInterface, MyConcreteType>();
myContainer.AddPostConstructor(x => (x as MyInterface)?.MyMethod());
可能吗?有没有better/more优雅的方法?
可能是这样的:
myContainer.RegisterType<MyInterface, MyConcreteType>(new InjectionFactory(c =>
{
var result = c.Resolve<MyConcreteType>();
result.MyMethod();
return result;
}));
另一种方式——通过特殊工厂注册实现并使用它:
class Factory
{
IUnityContainer _container;
public Factory(IUnityContainer container)
{
_container = container;
}
public void Register<TType>() where TType : MyInterface
{
myContainer.RegisterType<MyInterface, TType>(new InjectionFactory(c =>
{
var result = c.Resolve<TType>();
result.MyMethod();
return result;
}));
}
public MyInterface Get()
{
_container.Resolve<MyInterface>();
}
}
...
public TestClass
{
Factory _factory;
public TestClass(Factory factory)
{
_factory = factory;
_factory.Register<MyConcreteType>();
}
public void TestMethod()
{
var service = _factory.Get();
}
}
因此,所有未来的实现都必须在工厂中注册。但是仍然不能保证方法 MyMethod
将被正确实施或完全实施。