Вы можете экспортировать свой собственный 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
.
Части не полностью доверяют моему делу. Кроме того, так как я понятия не имею (со стороны экспортера), кто вызывает экспортированный Func, поэтому мне нужно, чтобы какой-то идентификатор передавался как параметр функции. Таким образом, часть заявляет, кто он. Это силовое отверстие безопасности, часть которого может претендовать на роль кого-то другого, и я верну секретные данные другой части к этому. Эта проблема может быть решена путем проектирования в момент, когда я создаю объект. В этот момент, используя метаданные, я знаю, какая часть, которую я создаю, и легко вставляю ее конкретные зависимости в свой конструктор. – Xaqron 2010-12-15 09:20:41