{"action":"created","issue":{"url":"https://api.github.com/repos/Particular/NServiceBus.AzureServiceBus/issues/388","repository_url":"https://api.github.com/repos/Particular/NServiceBus.AzureServiceBus","labels_url":"https://api.github.com/repos/Particular/NServiceBus.AzureServiceBus/issues/388/labels{/name}","comments_url":"https://api.github.com/repos/Particular/NServiceBus.AzureServiceBus/issues/388/comments","events_url":"https://api.github.com/repos/Particular/NServiceBus.AzureServiceBus/issues/388/events","html_url":"https://github.com/Particular/NServiceBus.AzureServiceBus/pull/388","id":184966115,"number":388,"title":"[WIP] Obsoleted / internalized types","user":{"login":"SeanFeldman","id":1309622,"avatar_url":"https://avatars.githubusercontent.com/u/1309622?v=3","gravatar_id":"","url":"https://api.github.com/users/SeanFeldman","html_url":"https://github.com/SeanFeldman","followers_url":"https://api.github.com/users/SeanFeldman/followers","following_url":"https://api.github.com/users/SeanFeldman/following{/other_user}","gists_url":"https://api.github.com/users/SeanFeldman/gists{/gist_id}","starred_url":"https://api.github.com/users/SeanFeldman/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SeanFeldman/subscriptions","organizations_url":"https://api.github.com/users/SeanFeldman/orgs","repos_url":"https://api.github.com/users/SeanFeldman/repos","events_url":"https://api.github.com/users/SeanFeldman/events{/privacy}","received_events_url":"https://api.github.com/users/SeanFeldman/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/Particular/NServiceBus.AzureServiceBus/labels/Type:%20Refactoring","name":"Type: Refactoring","color":"d7e102"}],"state":"open","locked":false,"assignee":{"login":"SeanFeldman","id":1309622,"avatar_url":"https://avatars.githubusercontent.com/u/1309622?v=3","gravatar_id":"","url":"https://api.github.com/users/SeanFeldman","html_url":"https://github.com/SeanFeldman","followers_url":"https://api.github.com/users/SeanFeldman/followers","following_url":"https://api.github.com/users/SeanFeldman/following{/other_user}","gists_url":"https://api.github.com/users/SeanFeldman/gists{/gist_id}","starred_url":"https://api.github.com/users/SeanFeldman/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SeanFeldman/subscriptions","organizations_url":"https://api.github.com/users/SeanFeldman/orgs","repos_url":"https://api.github.com/users/SeanFeldman/repos","events_url":"https://api.github.com/users/SeanFeldman/events{/privacy}","received_events_url":"https://api.github.com/users/SeanFeldman/received_events","type":"User","site_admin":false},"assignees":[{"login":"SeanFeldman","id":1309622,"avatar_url":"https://avatars.githubusercontent.com/u/1309622?v=3","gravatar_id":"","url":"https://api.github.com/users/SeanFeldman","html_url":"https://github.com/SeanFeldman","followers_url":"https://api.github.com/users/SeanFeldman/followers","following_url":"https://api.github.com/users/SeanFeldman/following{/other_user}","gists_url":"https://api.github.com/users/SeanFeldman/gists{/gist_id}","starred_url":"https://api.github.com/users/SeanFeldman/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SeanFeldman/subscriptions","organizations_url":"https://api.github.com/users/SeanFeldman/orgs","repos_url":"https://api.github.com/users/SeanFeldman/repos","events_url":"https://api.github.com/users/SeanFeldman/events{/privacy}","received_events_url":"https://api.github.com/users/SeanFeldman/received_events","type":"User","site_admin":false}],"milestone":{"url":"https://api.github.com/repos/Particular/NServiceBus.AzureServiceBus/milestones/15","html_url":"https://github.com/Particular/NServiceBus.AzureServiceBus/milestones/7.1.0","labels_url":"https://api.github.com/repos/Particular/NServiceBus.AzureServiceBus/milestones/15/labels","id":2075210,"number":15,"title":"7.1.0","description":null,"creator":{"login":"SeanFeldman","id":1309622,"avatar_url":"https://avatars.githubusercontent.com/u/1309622?v=3","gravatar_id":"","url":"https://api.github.com/users/SeanFeldman","html_url":"https://github.com/SeanFeldman","followers_url":"https://api.github.com/users/SeanFeldman/followers","following_url":"https://api.github.com/users/SeanFeldman/following{/other_user}","gists_url":"https://api.github.com/users/SeanFeldman/gists{/gist_id}","starred_url":"https://api.github.com/users/SeanFeldman/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SeanFeldman/subscriptions","organizations_url":"https://api.github.com/users/SeanFeldman/orgs","repos_url":"https://api.github.com/users/SeanFeldman/repos","events_url":"https://api.github.com/users/SeanFeldman/events{/privacy}","received_events_url":"https://api.github.com/users/SeanFeldman/received_events","type":"User","site_admin":false},"open_issues":1,"closed_issues":3,"state":"open","created_at":"2016-10-17T18:03:09Z","updated_at":"2016-10-24T21:59:03Z","due_on":null,"closed_at":null},"comments":2,"created_at":"2016-10-24T21:59:03Z","updated_at":"2016-10-26T04:21:58Z","closed_at":null,"pull_request":{"url":"https://api.github.com/repos/Particular/NServiceBus.AzureServiceBus/pulls/388","html_url":"https://github.com/Particular/NServiceBus.AzureServiceBus/pull/388","diff_url":"https://github.com/Particular/NServiceBus.AzureServiceBus/pull/388.diff","patch_url":"https://github.com/Particular/NServiceBus.AzureServiceBus/pull/388.patch"},"body":"## Who's affected\r\n\r\n- Anyone extending and customizing Azure Service Bus transport version 7 and above\r\n\r\n## Symptoms\r\n\r\nVersion 7.0 of the ASB transport has exposed internal types that shouldn't have been exposed.\r\n\r\n## Original issue\r\n\r\nThe following types have been exposed and broken down into several categories for a review.\r\n\r\n**Types that should be exposed**\r\n\r\n✔️ IIndividualizationStrategy\r\n✔️ StoppableTopology\r\n✔️ IHandleOversizedBrokeredMessages\r\n✔️ ITopology\r\n✔️ ISanitizationStrategy\r\n✔️ ICompositionStrategy\r\n✔️ INamespacePartitioningStrategy\r\n\r\n**Types that should NOT have been exposes at all**\r\n\r\n❌ ITransportPartsContainer\r\n❌ IResolveTransportParts  \r\n❌ IRegisterTransportParts\r\n❌ INotifyIncomingMessages\r\n❌ IClientSideSubscriptionFilter\r\n❌ INamespaceManager ==|> NamespaceManagerAdapter\r\n\r\n**Types that require intimate knowledge of topologies and/or transport**\r\n\r\n❗️ ICreateAzureServiceBusSubscriptions ==|> AzureServiceBusSubscriptionCreator + AzureServiceBusSubscriptionCreatorV6 / AzureServiceBusForwardingSubscriptionCreator (creator per topology)\r\n❗️  ITopologySectionManager ==|> EndpointOrientedTopologySectionManager / ForwardingTopologySectionManager\r\n❗️ IOperateTopology ==|> TopologyOperator\r\n❗️ IBatcher ==|> Batcher / Batch / BatchedOperation\r\n❗️ IRouteOutgoingBatches ==|> DefaultOutgoingBatchRouter / ReceiveContext\r\n❗️ IManageMessageSenderLifeCycle ==|> MessageSenderLifeCycleManager\r\n❗️ ICreateMessageSenders ==|> MessageSenderCreator\r\n❗️ IManageMessagingFactoryLifeCycle ==|> MessagingFactoryLifeCycleManager\r\n❗️ ICreateMessagingFactories ==|> MessagingFactoryCreator\r\n❗️ ICreateMessageReceivers ==|> MessageReceiverCreator\r\n❗️ IManageMessageReceiverLifeCycle ==|> MessageReceiverLifeCycleManager\r\n❗️ IConvertBrokeredMessagesToIncomingMessages ==|> DefaultBrokeredMessagesToIncomingMessagesConverter is the default. Custom implementation not possible since it would require ICanMapConnectionStringToNamespaceAlias which is an internal contract\r\n❗️ IConvertOutgoingMessagesToBrokeredMessages ==|> DefaultBatchedOperationsToBrokeredMessagesConverter\r\n\r\n\r\n**Types in question**\r\n\r\n❓ ICreateTopology ==|> TopologyCreator\r\n❓ IManageNamespaceManagerLifeCycle ==|> NamespaceManagerLifeCycleManager\r\n❓ ICreateNamespaceManagers ==|> NamespaceManagerCreator\r\n❓ ICreateAzureServiceBusQueues ==|> AzureServiceBusQueueCreator\r\n❓ ICreateAzureServiceBusTopics ==|> AzureServiceBusTopicCreator\r\n❓ IClientEntity ==|> IMessagingFactory / IMessageReceiver / IMessageSender \r\n❓ IMessagingFactory ==|> MessagingFactoryAdapter\r\n❓ IMessageReceiver ==|> MessageReceiverAdapter\r\n❓ IMessageSender ==|> MessageSenderAdapter\r\n❓ IBrokerSideSubscriptionFilter ==|> only exposed because of the public SubscriptionInfo, which is exposed via TopologySection revealed by ITopologySectionManager\r\n\r\n---\r\n\r\n#### `ITransportPartsContainer`, `IRegisterTransportParts`, `IResolveTransportParts`\r\n\r\n- Default container implementation (`TransportPartsContainer`) was not intended for replacement. \r\n- Access to the default container is revealed via dependency resolution, which can lead to undesired results.\r\n\r\n#### `INotifyIncomingMessages`\r\n\r\n`TopologyOperator` creates `INotifyIncomingMessages`, but it's [coupled to `MessageReceiverNotifier` implementation](https://github.com/Particular/NServiceBus.AzureServiceBus/blob/01b0b804c69d5d085e78d092d1b78f876fa84914/src/Transport/Topology/TopologyOperator.cs#L117) only. Having `INotifyIncomingMessages` exposed adds no value.\r\n\r\n#### `IStoppableTopology`\r\n\r\nTo be merged with `ITopology` in 8.0.0\r\n\r\n#### `INamespaceManager`\r\n\r\nDefault implementation provided by `NamespaceManagerAdapter` is an abstraction on top of native `NamespaceManager` and additional functionality required to determine if management is allowed for a given namespace.\r\n\r\n#### `IClientSideSubscriptionFilter`\r\n\r\nExposed via `SubscriptionInfo.ClientSideFilter` that is never used\r\n\r\n<!-- query used\r\nfrom t in Application.Types\r\nwhere t.IsPubliclyVisible && t.TypesThatImplementMe.Count() == 1\r\nselect new { t, impl = t.TypesThatImplementMe.Single() }\r\n--> "},"comment":{"url":"https://api.github.com/repos/Particular/NServiceBus.AzureServiceBus/issues/comments/256245937","html_url":"https://github.com/Particular/NServiceBus.AzureServiceBus/pull/388#issuecomment-256245937","issue_url":"https://api.github.com/repos/Particular/NServiceBus.AzureServiceBus/issues/388","id":256245937,"user":{"login":"SeanFeldman","id":1309622,"avatar_url":"https://avatars.githubusercontent.com/u/1309622?v=3","gravatar_id":"","url":"https://api.github.com/users/SeanFeldman","html_url":"https://github.com/SeanFeldman","followers_url":"https://api.github.com/users/SeanFeldman/followers","following_url":"https://api.github.com/users/SeanFeldman/following{/other_user}","gists_url":"https://api.github.com/users/SeanFeldman/gists{/gist_id}","starred_url":"https://api.github.com/users/SeanFeldman/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SeanFeldman/subscriptions","organizations_url":"https://api.github.com/users/SeanFeldman/orgs","repos_url":"https://api.github.com/users/SeanFeldman/repos","events_url":"https://api.github.com/users/SeanFeldman/events{/privacy}","received_events_url":"https://api.github.com/users/SeanFeldman/received_events","type":"User","site_admin":false},"created_at":"2016-10-26T04:21:58Z","updated_at":"2016-10-26T04:21:58Z","body":"Somewhat related issue #390 - Internal contracts with a single implementation only"}}
{"actor":{"display_login":"SeanFeldman"}}