Вы можете экспортировать свой собственный Func
вместо:
public class FooFactory
{
[Export(typeof(Func<string,int,ExportLifetimeContext<IFoo>>))]
public ExportLifetimeContext<IFoo> CreateFoo(string param1, int param2)
{
Foo foo = new Foo(param1, param2);
return new ExportLifetimeContext<IFoo>(foo,
delegate
{
// Clean-up action code goes here. The client might not be able
// to do this through the IFoo interface because it might not
// even expose a Dispose method.
//
// If you created other hidden dependencies in order to construct
// Foo, you could also clean them up here.
foo.Dispose();
});
}
}
и импортируйте его в другое место:
[Export(typeof(ISomething))]
public class FooUser : ISomething
{
private readonly Func<string,int,ExportLifetimeContext<IFoo>> fooFactory;
[ImportingConstructor]
public FooUser(Func<string,int,ExportLifetimeContext<IFoo>> fooFactory)
{
this.fooFactory = fooFactory;
}
public void DoSomething()
{
using (var fooLifetime = this.fooFactory("hello", 3))
{
IFoo foo = fooLifetime.Value;
...
}
}
}
Если вам не нужно очищающее действие, вы можете значительно упростить это, выбрасывая все ExportLifetimeContext
.
Однако некоторые реализации IFoo
могут быть одноразовыми (или зависеть от других одноразовых предметов), а другие - нет. Поэтому самое правильное, что нужно сделать, - это встроить сигнал «Я закончил с этим объектом» в абстракцию, что и обеспечивает ExportLifetimeContext
.