10000 DockerService, ManifestService, ImageDigestCache, and RegistryServiceClient classes are all too tightly coupled · Issue #1265 · dotnet/docker-tools · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
DockerService, ManifestService, ImageDigestCache, and RegistryServiceClient classes are all too tightly coupled #1265
Open
@lbussell

Description

@lbussell

At a high level, DockerService depends on the ManifestService. However, DockerService only relies on the ManifestService for methods that have the exact same signature and behavior as ManifestService commands (or its extension methods).

public Task<IEnumerable<string>> GetImageManifestLayersAsync(string image, IRegistryCredentialsHost credsHost, bool isDryRun) =>
_manifestService.GetImageLayersAsync(image, credsHost, isDryRun);

The DockerServiceCache is also tightly coupled with the ImageDigestCache class because of the same reason. ImageDigestCache simply makes and caches calls to the ManifestService class (through DockerService).

public Task<string?> GetImageDigestAsync(string image, IRegistryCredentialsHost credsHost, bool isDryRun) =>
_imageDigestCache.GetImageDigestAsync(image, credsHost, isDryRun);

public Task<string?> GetImageDigestAsync(string tag, IRegistryCredentialsHost credsHost, bool isDryRun) =>
LockHelper.DoubleCheckedLockLookupAsync(_digestCacheLock, _digestCache, tag,
() => _dockerService.GetImageDigestAsync(tag, credsHost, isDryRun),
// Don't allow null digests to be cached. A locally built image won't have a digest until
// it is pushed so if its digest is retrieved before pushing, we don't want that
// null to be cached.
val => !string.IsNullOrEmpty(val));

We should remove DockerService's dependency on the ManifestService class, since there are commands that use the DockerService that don't rely on any functionality from the ManifestService. ImageDigestCache should become ManifestServiceCache (or potentially RegistryServiceClientCache, since that is the only class making the single network call). We should experiment with combining ManifestService and RegistryServiceClient.

Also, ManifestServiceExtensions can be combined into the ManifestService class since they are in the same namespace.

I have put together a branch where I experimented with removing the DockerService dependency on the ManifestService, but it is currently incomplete and not fully functional - https://github.com/lbussell/docker-tools/commits/dev/loganbussell/1262playground/

Metadata

Metadata

Assignees

Type

No type

Projects

Status

Backlog

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions

    0