Попытка внедрить зависимость в службу WCF, размещенную в IIS, с использованием MEF. - PullRequest
4 голосов
/ 17 августа 2011

Я пытаюсь внедрить определенный класс в мой сервис WCF, но он не работает, и я не могу понять, почему. Я ОЧЕНЬ НОВИНКА для MEF и шаблонов, просто пытаюсь заставить его работать. Посмотрел серию видеороликов, чтобы понять, о чем идет речь, но в моем случае начальная загрузка не будет работать, поскольку это не Silverlight http://channel9.msdn.com/blogs/mtaulty/mef--silverlight-4-beta-part-1-introduction

Вот код Global.asax моего веб-приложения. Это не MVC, просто обычное приложение ASP.NET:

private void Application_Start(object sender, EventArgs e)
        {
            RegisterRoutes();

            var catalog = new WebScopedCatalog(new DirectoryCatalog(Server.MapPath("~\\bin"))); 
            var container = new CompositionContainer(catalog);
            container.ComposeParts(this);
        }

ПЕРВЫЙ, я не уверен, что я даже загрузил его правильно. ВТОРОЕ, я использую http://www.timjroberts.com/2011/02/web-scoped-mef-parts/ в качестве руководства для деталей, имеющих веб-область. Мне это нужно, потому что некоторые внедренные объекты должны жить только во время запроса.

Теперь у меня есть следующий класс:

    [Export(typeof(ITest))]
    [WebPartCreationPolicy(WebCreationPolicy.Session)]
    public class Test : ITest
    {
        public string TestMe()
        {
            return "Hello!";
        }
    }

А мой сервис выглядит так:

[ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    public class MobileService
    {
        [Import]
        public ITest MyTestClass { get; set; }

        public MobileService()
        {
            int i = 10;
        }

Когда точка останова достигает i = 10 - у меня есть NULL внутри MyTestClass. Ясно, что MEF не инициализирует этот класс для меня. Я что-то упустил?

EDIT:

Когда я изучаю каталог - я вижу свой класс Exported, но я не вижу его импортированным ... enter image description here

РЕДАКТИРОВАТЬ 2: Даниэль, спасибо. Это имеет смысл. На данный момент мне все еще кажется, что это волшебство. Да, WCF создает этот сервис. У меня есть MembershipProvider и различные служебные классы, которые ВСЕ нуждаются в одинаковом импорте. И я не создаю ни один из этих классов, поэтому я не могу позволить, чтобы Меф создал их. (Служба, созданная WCF, MembershipProvider, созданный who-know-what, классы Utility имеют статические методы ...) Я хотел использовать Mef вместо хранения своих вещей в HttpContext.Current. Мой контейнерный объект не имеет SatisfyImports. У этого есть SatisfyImportsOnce. Что если я сделаю это во множестве разных конструкторов? Будет ли Mef использовать один и тот же синглтон или каждый раз будет создавать новый экземпляр?

В этот момент мне интересно, должен ли я вообще использовать Mef в этом конкретном сценарии ..

Ответы [ 3 ]

5 голосов
/ 17 августа 2011

MEF не удовлетворит импорт для объектов, которые он не создает. Что создает MobileService? Если это не MEF, то импорт не будет выполнен по умолчанию. Даже если это MEF, импорт не будет выполнен в конструкторе - вы не можете установить свойства для объекта, который вы создаете, пока он не будет завершен (т.е. конструктор завершен).

Вы можете вызвать container.SatisfyImportsOnce (mobileService), чтобы удовлетворить импорт части. Вы должны стараться избегать этого везде, где вам нужен импорт MEF. Если вы можете, вы должны экспортировать деталь и импортировать ее из другой детали, чтобы MEF обработал создание для вас. Тем не менее, похоже, что эта часть может быть создана WCF, поэтому вы не можете создать ее в MEF, и в этом случае будет нормально использовать SatisfyImportsOnce.

Ответ на EDIT2: Если вы используете один и тот же контейнер каждый раз, MEF по умолчанию создаст только один экземпляр детали с экспортом. Вы можете установить CreationPolicy на NonShared (в атрибуте экспорта или импорта), чтобы изменить это.

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

2 голосов
/ 18 августа 2011

Политика создания веб-частей, которую я написал, не поможет со службами WCF.

Я опубликовал новое сообщение в блоге, в котором описывается подход к составным службам WCF: http://www.timjroberts.com/2011/08/wcf-services-with-mef/

По сути, вам необходимо реализовать собственный поставщик экземпляров, который поддерживает MEF и может создавать объект службы WCF при его создании.

0 голосов
/ 17 ноября 2012

Я писал о том, как составить ваш WCF в общем виде, который базируется на его конфигурации:

Unit-тестирование, WCF и MEF

Я действительно построил свое решениео примерах кода Тима Роберта, приведенных в его посте.только потому, что я пошел дальше и вместо того, чтобы использовать код в глобальном asax, я переместил конфигурацию в web.config, чтобы его было проще поддерживать.

...