Ответ 1
Если вы хотите отделить свои абстракции от их реализаций (всегда достойная цель), вы должны определить эти абстракции в своей собственной сборке.
Со стороны реализации это легко справиться, потому что вам нужно ссылаться на абстракции для их реализации. Нет никакого способа обойти это, используете ли вы MEF или нет, так, как это было всегда:
[Import(typeof(IFoo))]
public class MyFoo : IFoo { }
Однако, как вы говорите, это означает, что вы не можете ссылаться на свой Корень композиции из библиотеки абстракции. Однако, как и должно быть, потому что абстракции не должны беспокоиться о том, как они сочиняются.
Другими словами, вы должны реализовать состав зависимостей вне библиотеки абстракции. Хорошим кандидатом для этого является сам исполняемый файл, тогда как вы сохраните все свои конкретные реализации в одной или отдельных библиотеках.
Библиотека абстракции не будет иметь ссылок, в то время как как потребители, так и разработчики должны будут ссылаться на нее, поэтому граф зависимостей может выглядеть следующим образом:
Composition Root --> Abstractions <-- Implementations
Если стрелки обозначают ссылку.