Với mô tả trường hợp sử dụng của bạn, tôi muốn nói bạn có một vài tùy chọn.
Đầu tiên, bạn chỉ có thể yêu cầu mỗi ứng dụng đăng ký bộ phụ thuộc riêng của họ bao gồm phạm vi toàn thời gian. Có một hoặc hai "bản sao" đoạn mã trong khía cạnh này không phải là lớn của một thỏa thuận xem xét sự khác biệt giữa các ứng dụng và thực tế là đăng ký xuất hiện khá nhỏ.
Thứ hai, bạn có thể bọc phần chung (trừ phạm vi tuổi thọ) thành phương pháp mở rộng ContainerBuilder có thể được sử dụng trong mỗi ứng dụng. Nó sẽ vẫn có nghĩa là mỗi ứng dụng có một chút "mã trùng lặp" nhưng logic chung sẽ được bao bọc trong một phần mở rộng đơn giản.
public static IRegistrationBuilder<TLimit, ScanningActivatorData, DynamicRegistrationStyle>
RegisterConnection<TLimit, ScanningActivatorData, DynamicRegistrationStyle>(this ContainerBuilder builder)
{
// Put the common logic here:
builder.Register(...).AsImplementedInterfaces();
}
tiêu thụ như một phần mở rộng trong mỗi ứng dụng sẽ như thế nào:
builder.RegisterConnection().InstancePerHttpRequest();
// or
builder.RegisterConnection().InstancePerLifetimeScope();
Cuối cùng, nếu bạn biết nó là một trong hai web hoặc phi web, bạn có thể làm một module tùy chỉnh để xử lý chuyển đổi :
public class ConnectionModule : Autofac.Module
{
bool _isWeb;
public ConnectionModule(bool isWeb)
{
this._isWeb = isWeb;
}
protected override void Load(ContainerBuilder builder)
{
var reg = builder.Register(...).AsImplementedInterfaces();
if(this._isWeb)
{
reg.InstancePerHttpRequest();
}
else
{
reg.InstancePerLifetimeScope();
}
}
}
Trong mỗi ứng dụng, sau đó bạn có thể đăng ký các module:
// Web application:
builder.RegisterModule(new ConnectionModule(true));
// Non-web application:
builder.RegisterModule(new ConnectionModule(false));
Ngoài ra, bạn đã đề cập phạm vi cuộc đời của bạn trong các ứng dụng khác có tên.Bạn có thể làm cho mô-đun của bạn lấy tên:
public class ConnectionModule : Autofac.Module
{
object _scopeTag;
public ConnectionModule(object scopeTag)
{
this._scopeTag = scopeTag;
}
protected override void Load(ContainerBuilder builder)
{
var reg = builder.Register(...)
.AsImplementedInterfaces()
.InstancePerMatchingLifetimeScope(this._scopeTag);
}
}
tiêu thụ cũng tương tự như:
// Web application (using the standard tag normally provided):
builder.RegisterModule(new ConnectionModule("httpRequest"));
// Non-web application (using your custom scope name):
builder.RegisterModule(new ConnectionModule("yourOtherScopeName"));
tôi muốn giới thiệu với chỉ đơn giản là sử dụng InstancePerLifetimeScope
trong một ứng dụng web trừ khi đó là thực sự những gì bạn dự định. Như đã nêu trong các câu trả lời/nhận xét khác, InstancePerHttpRequest
sử dụng phạm vi cuộc đời được đặt tên cụ thể để đảm bảo an toàn để tạo phạm vi cuộc sống của trẻ em; sử dụng InstancePerLifetimeScope
không có giới hạn như vậy để bạn sẽ thực sự nhận được một kết nối cho mỗi phạm vi con chứ không phải một kết nối cho yêu cầu. Cá nhân tôi, không cho rằng các nhà phát triển khác sẽ không sử dụng phạm vi cuộc sống của trẻ em (which is a recommended practice), vì vậy trong các ứng dụng của tôi, tôi rất cụ thể. Nếu bạn có toàn quyền kiểm soát ứng dụng của mình và bạn có thể đảm bảo rằng bạn không tạo thêm phạm vi con hoặc bạn thực sự muốn một kết nối cho mỗi phạm vi, thì có thể InstancePerLifetimeScope
sẽ giải quyết vấn đề của bạn.
Bạn có lưu ý đến các kết nối cụ thể trong cuộc đời không? Nếu vậy, chúng có khác nhau trong suốt thời gian tồn tại cho mỗi ứng dụng hay không? Điều gì về tổng hợp? Bạn có bơi trong một số ứng dụng chứ không phải trong ứng dụng khác không? –
Nó giống như bạn nói "Các phần mở rộng MVC sử dụng một phạm vi được đặt tên để đạt được cơ chế một lần cho mỗi yêu cầu." Http được đặt tên là phạm vi không có khi bạn sử dụng các mô-đun trong giao diện điều khiển ứng dụng. Hiện tại tôi đang xem xét đơn vị công việc sẽ là gì và sẽ được đóng gói trong phạm vi nào. –