Экспорт свойства MEF с PartCreationPolicy - PullRequest
4 голосов
/ 19 апреля 2010

Когда я пытаюсь сделать это:

[Export(typeof(IMyService))]
[PartCreationPolicy(CreationPolicy.Shared)]
private MyService Service
{
    get
    {
        var service = new MyService();
        service.Configure();
        return service;
    }
}

Я получаю ошибку компиляции: Attribute 'PartCreationPolicy' is not valid on this declaration type. It is only valid on 'class' declarations.

Это ошибка? Я не понимаю, почему MEF разрешает экспорт свойств, но не позволяет указывать время жизни детали.

Использование VS2010 RC.

1 Ответ

7 голосов
/ 19 апреля 2010

PartCreationPolicy должен идти в классе, даже если экспорт идет по свойству. Класс - это то, что соответствует детали, и политика создания будет контролировать, создает ли MEF новый экземпляр класса каждый раз, когда от него запрашивается экспорт, или нет.

Я не уверен, хотите ли вы использовать Shared или NonShared. В вашем примере кода для CreationPolicy установлено значение Shared, но затем вы создаете новый экземпляр MyService в получателе вашего свойства. Похоже, это указывает на то, что вы, возможно, ищете политику создания NonShared.

Если вы хотите, чтобы новая служба создавалась каждый раз при запросе экспорта, вы должны делать это с помощью политики создания, а не путем создания нового экземпляра в получателе. Значение экспорта не должно изменяться во время выполнения, и на самом деле MEF вызовет метод получения только один раз и сохранит возвращаемое значение, когда ему потребуется снова получить доступ к экспортированному значению. Таким образом, создание нового экземпляра в вашем геттере может создать впечатление, что будет создано несколько сервисов, когда на самом деле будет только один.

...